Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >浅谈学习正则表达式的重要性

浅谈学习正则表达式的重要性

作者头像
IT自学不成才
发布于 2019-01-08 03:05:45
发布于 2019-01-08 03:05:45
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

浅谈学习正则表达式的重要性

2017-08-10 by Liuqingwen | Tags: Hexo Web | Hits

一、问题

使用 Hexo 搭建博客确实简单又强大,简单在于构建和发布过程,强大在于它的扩展性。关于 Hexo 博客插件功能有兴趣的朋友可以参考我之前的一篇文章:分享几个实用的 HEXO 博客功能插件 ,但是有时候这些功能比较官方,我们还是需要自己动手 DIY 一下才能更好的适应自己的网页。我现在使用的博客 RSS 订阅功能这个插件( hexo-generator-feed )就不太适合我自己的博客行情

问题是这样的,因为我使用了图片懒加载的功能,导致生成的 RSS.xml 文件包含的图片部分是真实地址,部分是预加载图片的地址而不是真实源图片地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p><img src="http://url/to/imgloader.gif" data-echo="real-image.jpg"></p>
<p><img src="real-image.jpg"></p>
<p><img src="http://url/to/real-image.jpg"></p>

这个时候就需要自己动手稍微 Hack 一下插件的源码了,对整篇的文字进行查找替换就需要正则表达式派上用场了。

二、解决方法

对于 JavaScript 编程我是门外汉,不过好在正则表达式在不同语言之间是通用的,至少大部分场景是这样,那么对于会 Java 的我来说对源码简单修改一下足够了。关于正则表达式这里有一篇文章总结的比较好,刚好介绍了我需要使用的知识点:正则表达式中的不匹配,下面引用的是文章的正则表达式定义表格:

表达式

定义

表达式

定义

表达式

定义

表达式

定义

表达式

定义

abc

a或b或c

.

任意单个字符

a?

零个或一个a

^abc

任意不是abc的字符

\s

空格

a*

零个或多个a

a-z

a-z的任意字符

\S

非空格

a+

一个或多个a

a-zA-Z

a-z或A-Z

\d

任意数字

a{n}

正好出现n次a

^

一行开头

\D

任意非数字

a{n,}

至少出现n次a

$

一行末尾

\w

任意字母数字或下划线

a{n,m}

出现n-m次a

(…)

括号用于分组

\W

任意非字母数字或下划线

a*?

零个或多个a(非贪婪)

(a|b)

a或b

(a)…\1

引用分组

(?=a)

前面有a

(?!a)

前面没有a

对于上面的代码我要做到三点:

  1. 图片 src 是真实地址的不能改,比如: src="http://url/to/real-image.jpg"
  2. 图片 src 是相对地址的,需要添加绝对地址: src="real-image.jpg" 改成 src="http://url/to/real-image.jpg"
  3. 图片 src 是懒加载图片的,修改为 data-echo 表示的绝对地址: src="http://url/to/imgloader.gif" data-echo="real-image.jpg" 改成 src="http://url/to/real-image.jpg"

第三种情况很好处理,正则表达式: /(http\:\/\/url\/to\/imgloader.gif" data-echo=")/g 来进行替换即可 ,这里很多符号需要使用 \ 反斜杠来转义,另外 g 表示全局搜索替换。

第二种情况和第一种情况很相似,但是第一种情况是不需要做任何修改的,刚开始我简单的替换 src=" 为绝对路径 src=http://url/to/ 是行不通的,这样会把第一种情况的图片地址也替换掉: src="http://url/to/http://url/to/real-image.jpg" 这是我不想要的结果!

所以,这里需要用到正则表达式中的不匹配原则了,如果路径中不包含 http:// 那么就是相对地址,需要修改!正则表达式是: /<img src="(?!http:\/\/).+(.jpg|.png|.gif)"/gi ,显然, (?!http:\/\/) 是表示匹配字符串不包含 http:// 的意思,这里注意 i 表示不区分大小写进行搜索, . 表示匹配任何换行符之外的单个字符,然后 + 代表不止一个, (.jpg|.png|.gif) 表示这三种图片格式中的任何一种即可。这样正则表达式就达到匹配搜素的目的了。

另外,正则表达中括号 () 非常有用( (x)(?:x) 含义相反,可以参考相关资料 ),初学者很容易忽略这一点!它的含义和用途是:

(x) 匹配 x 并且记住匹配项,就像下面的例子展示的那样。括号被称为捕获括号。 模式 /(foo) (bar) \1 \2/ 中的 (foo)(bar) 匹配并记住字符串 foo bar foo bar 中前两个单词。模式中的 \1\2 匹配字符串的后两个单词。注意 \1\2\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1$2$n 这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')

所以最终我的代码如下,我加了两个括号用于记住匹配项并用 $1$2 来使用,代码一目了然:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(feedConfig.replaceURL) {
    var regLazy = /(http\:\/\/liuqingwen.me\/blog\/images\/imgloader.gif" data-echo=")/g;
    var regSrc = /(<img src=")((?!http:\/\/).+(.jpg|.png|.gif)")/gi;
    posts.forEach(function(post) {
        var coverdiv = post.permalink + post.cover_index;
        var contenthead = '<span class="image main"><img src="' + coverdiv + '" alt="' + post.title + '"></span>';
        var content = post.content.replace(regSrc, "$1" + post.permalink + "$2");
        content = content.replace(regLazy, post.permalink);
        //element.content = contenthead + content;
        post.newContent = contenthead + content;
    });
}

注意上面代码中我所注释的那段代码,我发现我并不能直接修改 element.content 那样会导致我所有博客文章和 RSS 文件一同被莫名其妙地改掉,这是我没有预料到的,所以,鉴于 JavaScript 的动态语言特性,我给每篇文章 post 动态地添加了一个属性: post.newContent 用于 RSS 的生成。

最后还需要在模板代码中进行应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% if config.feed.content and post.content and post.newContent %}
    <content type="html"><![CDATA[{{ post.newContent | safe }}]]></content>
{% elif config.feed.content and post.content %}
    <content type="html"><![CDATA[{{ post.content | safe }}]]></content>
{% endif %}

三、写在最后

其实我们在进行字符串匹配、替换、修改的时候,我们不一定完全需要使用正则表达式,特别是那些不复杂的情况,简单使用字符串的一些标准方法就可以进行查找替换修改了。但是,我觉得能用正则表达式就尽量使用正则表达式,有时候性能也不会差,我给出三点简单的原因:

1 正则表达式有时候并不慢

在对于长篇的文字匹配搜索的时候,正则表达式表达更加合理,速度也不慢,我觉得优先使用正则表达式。虽然我也没有理论支持,但是想想,正则表达式为啥存在于各种语言之中?是吧。

2 我所熟悉的 Java 中 replaceAll 函数

这个函数表面上和 replace 一样,实际上它的第一个参数是一个正则表达式而非字符,所以 "1.2.3".replaceAll(".", "-") 的结果不是 1-2-3 而是 ----- ,因为 "." 是正则表达式代表任何非空字符的匹配规则啊。

3 正则表达式在不同语言中基本通用

不一定是 JavaScript ,对于 Java 或者其他语言都能通用正则表达式,看来学习它是很有必要的,你说呢?

参考资料:

正则表达式(MDN - Mozilla Developer Network): https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

正则表达式中的不匹配: http://www.isnowfy.com/regular-expression-negative/

EJS (GitHub): https://github.com/tj/ejs

SWIG (GitHub): https://github.com/paularmstrong/swig

PUG (GitHub): https://github.com/pugjs/pug

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
15个实用的PHP正则表达式
对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式的字符串。这篇文章主要介绍了15个超实用的php正则表达式,需要的朋友可以参考下。在这篇文章里,我已经编写了15个超有用的正则表达式,WEB开发人员都应该将它收藏到自己的工具包。验证域名检验一个字符串是否是个有效域名.
大师级码师
2021/10/27
7480
Python正则表达式
正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的
王大力测试进阶之路
2019/10/25
9600
Python正则表达式
Java 正则表达式
为让大家对正则表达式底层实现有一个直观的映象,给大家举个实例给你一段字符串(文本),请找出所有四个数字连在一起的子串,比如:应该找到19981999 3443 9889>分析底层实现RegTheory.java
用户9615083
2022/12/25
1.1K0
Java 正则表达式
常用正则表达式
/^([0-9]{1,}\.[0-9]{1,}|[0-9]{1,})$/    数字或小数点
Java架构师必看
2020/04/22
6580
正则表达式教程
http://regex.larsolavtorvik.com/ http://tool.oschina.net/regex http://www.rubular.com/ http://zhengze.51240.com/ http://www.kingshang.com/ http://zhengze.51240.com/
老高的技术博客
2022/12/24
1.9K0
Python正则表达式
如何把一个字符串的特征或规则告诉给计算机,让计算机知道你要描述的东西。被称为正则。
用户2700375
2022/06/09
6120
Python正则表达式
php使用正则表达式实现替换的方法
了解php使用正则表达式实现替换的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
用户8099761
2023/05/11
2.2K0
php使用正则表达式实现替换的方法
「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试
前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学
荣仔_最靓的仔
2021/02/02
1.6K0
「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试
前端基础-正则表达式(环视)
第6章 环视 也叫 预查、断言、零宽断言。 正则表达式中,用于查找某些内容之前或者之后的东西,叫做环视。 环视通常也叫做预查、断言或者零宽断言。 1、正向肯定预查 也叫 顺序肯定环视 every(?=
cwl_java
2020/03/26
5430
C#常见正则表达式
"^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1
恋喵大鲤鱼
2018/08/03
7260
Python爬虫基础六:正则表达式
我在刚开始学的时候,第三步是花费时间最多的地方。学习了一段时间,学了四种方法,分别是正则表达式、Beautiful Soup 、Xpath和PyQuery。接下来这几篇文章(包括这篇但不限于这篇文章),我会来逐步来分享我对这几种方法的理解。
远方的星
2021/08/05
5190
Python爬虫基础六:正则表达式
专栏:003:正则表达式
系列爬虫专栏 崇尚的学习思维是:输入,输出平衡,且维持平衡点不断精进的地步 曾经有大神告诫说:没事别瞎写文章;为此写的都是,在我能力范围内的 1:框架 序号 章节 解释 01 概念解释 概念是理解和精进的第一步 02 语法解释 2/8法则,解释使用最频繁的语法 03 代码实例 对博客内容进行使用正则表达式匹配 04 参考及说明 参考列表 ---- 2:概念 什么是正则表达式? 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Express
谢伟
2018/06/06
6470
正则表达式理论篇
学习正则表达式的你们,有没有发现,一开始总是记不住语法。嗯,加深大家的印象的同时,我也是来找同道中人的。
陈大鱼头
2021/10/09
1.3K0
正则表达式理论篇
正则表达式简介与常用表示
1、正则表达式是用来进行文本处理的技术,是与语言无关的一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式
大师级码师
2021/10/29
8340
Java中的正则表达式详解
为让大家对正则表达式底层实现有一个直观的映象,给大家举个实例 给你一段字符串(文本), 请找出所有四个数字连在一起的子串, 比如: 应该找到1998 1999 3443 9889 ===> 分析底层实现
timerring
2023/05/24
9670
Java中的正则表达式详解
[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。
Eastmount
2021/03/01
1.5K0
[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
C#常用正则表达式整理
C#常用正则表达式 非负整数(正整数 + 0): "^\d+$" 正整数 "^[0-9][1-9][0-9]$" 非正整数(负整数 + 0)"^((-\d+)|(0+))$" 负整数 "^-[0-9]
大师级码师
2021/10/27
6330
常用正则表达式
一, 1.^\d+$    //匹配非负整数(正整数 + 0) ---^:以数字开头 +:之前紧邻出现的一次或多次 2.[0-9]*[1-9][0-9]*$    //匹配正整数 3.^((-\d
用户1197315
2018/01/22
3K0
正则表达式
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/11712743
DannyHoo
2018/09/13
1.6K0
正则表达式
常用的20个正则表达式
正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升。
小小工匠
2021/08/16
3.3K0
相关推荐
15个实用的PHP正则表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验