正则表达式笔记


正则表达式笔记

正则表达式

字符的查找与替换

比如这样一段文字:

第一章 論德

上德不德 是以有德 下德不失德 是以無德

上德無爲 而無以爲也 上仁爲之 而無以爲也 上義爲之 而有以爲也 上禮爲之 而莫之應也 則攘臂而乃之

故失道而後德 失德而後仁 失仁而後義 失義而後禮 夫禮者 忠信之泊也 而亂之首也

前識者 道之華也 而愚之首也

是以大丈夫居其厚 而不居其泊 居其實 而不居其華 故去皮取此

第二章 得一

昔之得一者 天得一以清 地得一以寧 神得一以霝 浴得一以盈 侯王得一以爲天下正

其至之也 謂天毋已清將恐裂 謂地毋已寧將恐發 謂神毋已靈將恐歇 謂浴毋已盈將恐竭 謂侯王毋已貴以高將恐蹶

故必貴而以賤爲本 必高矣而以下爲基

夫是以侯王自謂孤 寡 不榖 此其賤之爲本欤 非也

故致數與無與 是故不欲祿祿若玉 硌硌若石

我们想要找出其中的章节行。这时就可以使用正则表达式匹配查找:第.*?章.*

.是单个字符;.*是字符串(?后面会讲到)。连起来的大概意思就是:查找形如第XX章XXX的字段。

第一章 論德

上德不德 是以有德 下德不失德 是以無德

上德無爲 而無以爲也 上仁爲之 而無以爲也 上義爲之 而有以爲也 上>禮爲之 而莫之應也 則攘臂而乃之

故失道而後德 失德而後仁 失仁而後義 失義而後禮 夫禮者 忠信之泊>也 而亂之首也

前識者 道之華也 而愚之首也

是以大丈夫居其厚 而不居其泊 居其實 而不居其華 故去皮取此

第二章 得一

昔之得一者 天得一以清 地得一以寧 神得一以霝 浴得一以盈 侯王得一>以爲天下正

其至之也 謂天毋已清將恐裂 謂地毋已寧將恐發 謂神毋已靈將恐歇 謂>浴毋已盈將恐竭 謂侯王毋已貴以高將恐蹶

故必貴而以賤爲本 必高矣而以下爲基

夫是以侯王自謂孤 寡 不榖 此其賤之爲本欤 非也

故致數與無與 是故不欲祿祿若玉 硌硌若石

文本高亮代表查找成功,被选中。接下来是替换命令:

查找(第.*?章.*)

(注意这里用()括了起来,是表引用)

替换<h3>$1</h3>

(这里的引用符是$1,因为只有1段被()括起了的内容〔如果有第二段被()引用的内容,那它便是$2,它们是$1$2。这个后面也会讲到〕;增加了 <h3> 标签)

<h3>第一章 論德</h3>


上德不德 是以有德 下德不失德 是以無德

上德無爲 而無以爲也 上仁爲之 而無以爲也 上義爲之 而有以爲也 上禮爲之 而莫之應也 則攘臂而乃之

故失道而後德 失德而後仁 失仁而後義 失義而後禮 夫禮者 忠信之泊也 而亂之首也

前識者 道之華也 而愚之首也

是以大丈夫居其厚 而不居其泊 居其實 而不居其華 故去皮取此

<h3>第二章 得一</h3>


昔之得一者 天得一以清 地得一以寧 神得一以霝 浴得一以盈 侯王得一以爲天下正

其至之也 謂天毋已清將恐裂 謂地毋已寧將恐發 謂神毋已靈將恐歇 謂浴毋已盈將恐竭 謂侯王毋已貴以高將恐蹶

故必貴而以賤爲本 必高矣而以下爲基

夫是以侯王自謂孤 寡 不榖 此其賤之爲本欤 非也

故致數與無與 是故不欲祿祿若玉 硌硌若石

<h3>第四章 反復</h3>


反也者 道之動也 弱也者 道之用也

天下之物生於有 有生於無

第一章 論德

上德不德 是以有德 下德不失德 是以無德

上德無爲 而無以爲也 上仁爲之 而無以爲也 上義爲之 而有以爲也 上禮爲之 而莫之應也 則攘臂而乃之

故失道而後德 失德而後仁 失仁而後義 失義而後禮 夫禮者 忠信之泊也 而亂之首也

前識者 道之華也 而愚之首也

是以大丈夫居其厚 而不居其泊 居其實 而不居其華 故去皮取此

第二章 得一

昔之得一者 天得一以清 地得一以寧 神得一以霝 浴得一以盈 侯王得一以爲天下正

其至之也 謂天毋已清將恐裂 謂地毋已寧將恐發 謂神毋已靈將恐歇 謂浴毋已盈將恐竭 謂侯王毋已貴以高將恐蹶

故必貴而以賤爲本 必高矣而以下爲基

夫是以侯王自謂孤 寡 不榖 此其賤之爲本欤 非也

故致數與無與 是故不欲祿祿若玉 硌硌若石


贪婪匹配

*+是贪婪的,因为它们会尽可能多地匹配文字。”

举两个例子:

第一千章 不更了,再更傻逼!
第一千零一章 加更一章

查找:第.*章

第一千章 不更了,再更傻逼!
第一千零一章 加更一章

<font style="background-color:red;color:green;">Test</font>

查找:<font.*>

<font style="background-color:red;color:green;">Test</font>

返回的结果从逻辑上来讲没有任何问题,但跟我们想的好像不太一样……这时我们需要在*后加上限定符?,意为非贪婪,即最小匹配

查找:第.*?章

第一千章 不更了,再更傻逼!
第一千零一章 加更一章


查找:<font.*?>

<font style="background-color:red;color:green;">Test</font>

解决

不同字段的位置替换

前面说过,$不只可以有一个,而是可以有多个,$1 $2 $3……下面是一些简单的应用:

有谁知,鬓虽残,心未死!
——《夜游宫·记梦寄师伯浑》陆游

一杯且买明朝事,送了斜阳月又生。
——《鹧鸪天·嫩绿重重看得成》范成大

悠然心会,妙处难与君说。
——《念奴娇·过洞庭》张孝祥

比如上面的一段文字,我们想要把作者名放到书名号前,正则表达式就可以这样写:

  1. 查找:《.*》.*
    1. 查找:(《.*》)(.*)
  2. 替换:$2$1

(《.*》)$1(.*)$2$2$1的意思是将$1$2的位置对换,即:(.*)(《.*》)

执行的结果为:

有谁知,鬓虽残,心未死!
——陆游《夜游宫·记梦寄师伯浑》

一杯且买明朝事,送了斜阳月又生。
——范成大《鹧鸪天·嫩绿重重看得成》

悠然心会,妙处难与君说。
——张孝祥《念奴娇·过洞庭》


文章作者: 枕头递我一下
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 枕头递我一下 !
  目录