代码改变世界

我的正则表达式学习记录

2011-09-02 19:51  音乐让我说  阅读(302)  评论(0编辑  收藏  举报

在线正则表达式测试网站:https://regex101.com/ 

工具 RegexTester 下载:https://files.cnblogs.com/Music/RegexTester.zip

 

1>

.”可以匹配任意的 单个 字符、英文字母、数字、特殊字符(比如:%、$、#等等)、空格,以及它本身。

NOTE:很多情况下,“.”不匹配换行。但在RegexTester这个工具中,它匹配换行, 所以,这里有个值得注意的匹配,就是 回车符+exp,我在上面的代码中用绿色粗体标识出了(回车符难以标识)。

 

 

2>

[td] 表示匹配单个t字符,或者是单个d字符。

 

3>

[0-9] 可以匹配单个0到9之间的数字。 起始字符 和 结束字符,依据的是它的 ASCⅡ值的大小, 即是说,将会匹配其ASCⅡ码位于 起始字符 和 结束字符 的ASCⅡ之间的所有字符(包含起始、结束字符)。

4>

[^0-9a-z] 匹配单个字符既不是0到9之间的数字,也不是a到z之间的英文字母。

 

5>

\d 所有单个数字,与 [0-9] 相同

\D 所有非数字,与 [^0-9] 相同

\w 所有单个大小写字母、数字、下划线,还有汉字,与 [a-zA-Z0-9_] 相同

\W 所有单个非大小写字母、非数字、非下划线,与 [^a-zA-Z0-9_] 相同

\s 所有单个空字符,与 [\f\n\r\t\v] 相同

\S 所有单个非空字符,与 [^\f\n\r\t\v] 相同。

比如下图:

 

 

////////////////////分割线////////////////////

 

 

////////////////////分割线////////////////////

 

 

Regex:<body[^>]*>([\s\S]*?)<\/body>

Replace:<html>$1</html>

 

////////////////////分割线////////////////////

 

其中小写的 \s 表示 \r\n 等符号,也就是匹配换行符。大写的 \S 表示 非  \r\n 等符号,也就是非换行符。

 

Regex:<th[^>]*>([\s\S]*?)<\/th>

Replace:<td>$1</td>

 

 

////////////////////分割线////////////////////

 

 

Regex:<param\s*name=\"condition\"[^>]*>([\S]*?)<\/param>

Replace:<param name="condition">封装有查询条件的值的对象</param>

 

 

 

6> 

匹配一个或多个,用'+'  

j+  匹配一个或多个j

[abc]+  可以匹配中括号内,一个或多个的组合

\d+  匹配一个或多个数字

.+  匹配任意多个字符

匹配零个或多个,用 '*

j*  匹配零个或多个j

[abc]*  可以匹配中括号内,一个或多个的组合

\d*  匹配零个或多个数字

.*  匹配任意多个字符

匹配零个或一个,用'?'

flowers? 可以匹配flower、flowers  

 

7>

匹配固定数目的字符,用'{数字}'

例如:使用“\d{3}”,可以匹配从 000 到 999,这1000(10*10*10=1000)个数。 而使用“a{6}”,则可以匹配“aaaaaa”(也只能匹配它,因为“a”是固定字符)。

 

8>

匹配区间以内数目的字符,用'{最小数目,最大数目}'

Text : 0、10、111、001、789、1234 are all matched numbers. 0d、0h、1xx、99. are not matched.

Regex: \d{1,3}

Result :

0、10、111、001、789、1234

 

注意:它匹配了1234,是因为是作为123和4两个匹配的结果

 

特例:

最小数目可以是0,所以 “{0,1}”,相当于 “?”。 如果不限制最大数目,可以将最大数目设为空,所以“\d{1,}”相当于“+”;而“{0,}”相当于“*”。

 

 

9>

贪婪匹配  惰性匹配  匹配描述 ?   ??   匹配0个或1个 +   +?   匹配1个或多个 *   *?   匹配0个或多个 {n}   {n}?   匹配n个 {n,m}   {n,m}?   匹配n个或m个 {n,}   {n,}?   匹配n个或多个

 

注意 {n} 与 {n}? 是一样的,因为{n}已经限制了匹配n个字符,所以无所谓的贪婪还是惰性

 

 

10>

在 字符 前加“\b”,来匹配其 后面 的字符位于字符串首位的字符。

Text  The cat s cattered its food all over the room. RegEx  \bcat Result  cat

在 字符 后加“\b”,来匹配其 前面 的字符位于字符串末位的字符。

Text  The cat s cattered its food all over the room. RegEx  cat\b Result  cat

所以为了不匹配是不完整的cat ,需要这样写正则表达式:\bcat\b

\B 用来匹配不在边界的字符。

11>

^ 是匹配文本首的结果,而 $ 是匹配文本末的结果,用法与 ^ 相同

Text  city.jpg、city1.jpg are all beautiful pictures except city9.jpg RegEx  ^city\d?\.jpg (即在city\d?\.jpg中搜索位于文本首的结果,如果找到就删除其他的匹配结果) Result  city.jpg

 

12>

\s 匹配一个空格

\s* 匹配零个或多个空格

13>

匹配子模式:在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。 将子模式视为一个整体时,那么它就相当于一个单个字符。

Text

 This is the first line.<br><br     />  This is the second line.<br><br/><br />  This is the third line.<br>>>>>

Regex

 (<br\s*/?>){2,}

Result  <br><br     />  <br><br/><br />

 

在正则表达式中,可以使用“|”将一个表达式拆分成两部分“reg1|reg2”, 它的意思是:匹配所有符合表达式reg1的文本 或者 符合表达式reg2的文本。

Text

 The <b>text of</b> this row is bold.  The <i>text of</i> this row is italic.

Regex

 </?i>|</?b>

Result  <b>  </b>  <i>  </i>

 

14>断言:用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。

 

No.1  - 匹配以ing结尾的单词的前面部分(除了ing以外的部分)

Regex: \b\w+(?=ing\b)

Source: I'm singing while you're dancing

Result: sing   danc

 

No.2  - 匹配以re开头的单词的后半部分(除了re以外的部分)

Regex: (?<=\bre)\w+\b

Source: reading a book

Result: ading

 

No.3 - 匹配两边都有空格的数字(仅仅匹配除了空格以外的数字)

Regex: (?<=\s)\d+(?=\s)

Source: 1 22 333 444 555 666

Result: 分别为 new Group[] { "22", "333", "444", "555" }

 

\d{3}(?!\d)

 

断言非:表示不能出现什么规则

 

 

No.4 - 匹配三位数字,而且这三位数字的后面不能是数字;

Regex: \d{3}(?!\d)

Source: 1 22 333 4444 55555 666666 777,777 8888.888 99999*9999

Result: 省略

 

 

No.5 - 匹配不包含属性的简单HTML标签内里的内容

Regex: (?<=<(\w+)>).*(?=<\/\1>)

Source:

<span>群莺乱飞<b>吴</b></span> <span >Hello World</span> <span>你嘴上有残留物</span> <span id="message">保存成功</span>

Result: 分别为 new Group[] { "群莺乱飞<b>吴</b>", "你嘴上有残留物" }

 

No.6 - 非获取匹配,即不保存结果到 Group 中。

Regex: (?:ing|es|ies)

Source: hello word doing happies does

Result: ing  es  ies

 

No.7  - 匹配前面不包含"杆"字符,也不是开头(即:第一个字母)的大写字母

Regex:(?<!\-|^)([A-Z])

备注:比如核心是    (?<!\-|\#)(A-Z)       这个正则匹配  大写字母前  既不是  “杆”字符,也不是 “井号” 字符的 大写字母 

Source:HelloWorld-Fast-Join-Quit

Replace Regex:-$1

Result: -Hello-World-Fast-Join-Quit

 

 

15> 替换从网上复制的代码中前面的序号:

用 Editplus 的替换功能(貌似 Editplus 不支持 \d 语法)

16> 查找包含在双引号中的中文

"[^>]*?[\u4e00-\u9fa5][^>]*?"

 比如:

Text: abc类似的"def 王五gHi "上上网"是"

Result: 

结果1:"def 王五gHi "

结果2:"是"

17> 油管播放列表替换

替换前:1080p\s*\-\s*\d+

替换后:1080p

18>  

替换前:(\d{4}-\d{2}-\d{2})(.*?) - 1080p

替换后:$1 (1080p)$2

 

谢谢浏览!