#正则表达式

2019-10-10  本文已影响0人  公子拙

一、概述

英文(Regular Expression),简称Regex
用一个字符串来描述一个特征,然后去验证其他字符串是否符合这个特征。

如表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”
那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。

主要作用:

二、语法

(一)、普通字符匹配

1、字母数字等

a,0,+,我等

如表达式 "c",在匹配字符串 "abcde" 时
匹配结果是:成功;
匹配到的内容是:"c";
匹配到的位置是:开始于2,结束于3。
如表达式 "bcd",在匹配字符串 "abcde" 时
匹配结果是:成功;
匹配到的内容是:"bcd";
匹配到的位置是:开始于1,结束于4。

2、转义字符

\n\t\r,\,\f,\a,^,$`等

如表达式 "\$d",在匹配字符串 "abc$de" 时
匹配结果是:成功;
匹配到的内容是:"$d";
匹配到的位置是:开始于3,结束于5。

3、unicode字符

\u4e00

如表达式 "\u4e00。",在匹配字符串"他的人品万众无一。"时:
匹配结果是:成功;
匹配到的内容是:"一。";
匹配到的位置是:开始于6,结束于8。

(二)、元字符(预定义字符)匹配

1、\d\D

\d=1个数字字符(digit)字符[0-9]
\D=1个非数字字符[^0-9]

表达式 "\D\d",在匹配 "abc123" 时
匹配的结果是:成功;
匹配到的内容是:"c1";

2、\W\W

\w=1个单词(word)字符[a-zA-Z0-9_]
\W=1个非单词字符[^a-zA-Z0-9_]

3、\s\S

\s=1个空白(space)字符 [ \n\r\t\v\f]
\S=1个非空白字符[^ \n\r\t\v\f]

4、.

1个任意字符(排除\n或不排除)

表达式 "a.\d",在匹配 "aaa100" 时
匹配的结果是:成功;
匹配到的内容是:"aa1";
匹配到的位置是:开始于1,结束于4。

(三)、边界匹配

1、^和`###

^=字符串的开始位置
$=字符串的结束位置

表达式 "^aaa" 在匹配 "xxx aaa xxx" 时
匹配结果是:失败。
因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配
表达式 "^aaa"在匹配"aaa xxx xxx"时
匹配的结果是:成功;
匹配到的内容是:"aaa";
匹配到的位置是:开始于0,结束于3。
表达式 "aaa$" 在匹配 "xxx aaa xxx" 时
匹配结果是:失败。
因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配

2、\b\B

\b=匹配单词边界
\B=匹配非单词边界

表达式 "\bendB" 在匹配 "weekend,endfor,end" 时

(四)、字符组匹配

表达式 "[bcd][bcd]" 匹配 "abc123" 时
匹配的结果是:成功;
匹配到的内容是:"bc";
匹配到的位置是:开始于1,结束于3。
表达式 "[^abc]" 匹配 "abc123" 时
匹配的结果是:成功;
匹配到的内容是:"1";
匹配到的位置是:开始于3,结束于4。

(五)、匹配次数

表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时
匹配的结果是:成功;
匹配到的内容是:12.5;
匹配到的位置是:开始于10,结束于14。

(六)、运算符

1、XY

模式ab,表示a后面是b

2、X|Y

a|b,表示 一个a或者b

表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时
匹配结果是:成功;
匹配到的内容是:"Tom";
匹配到的位置是:开始于4,结束于7。
匹配下一个时
匹配结果是:成功;
匹配到的内容是:"Jack";
匹配到的位置时:开始于15,结束于19。

小括号可限制选择范围

3、(X)

表示分组且捕获X

表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时
匹配结果是:成功;
匹配到内容是:"go go go";
匹配到的位置是:开始于6,结束于14。

4、(?:X)

仅用于分组,不捕获

5、\n

引用前面的捕获组n

//匹配html标签
/<(\w+)>[^<]*</\1>/
表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时
匹配结果是:成功;
匹配到的内容是:" 'Hello' "。
再次匹配下一个时,可以匹配到 " "World" "。

三、贪婪和非贪婪模式

(一)、贪婪模式

表达式中{m,n}, {m,}, ?, *, +的这些重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。称为贪婪模式

如:针对字符串"1xxxdxxxd",表达式1\w+的匹配结果是1xxxdxxxd。而不是1x

(二)、非贪婪模式

在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。
如:针对字符串"1xxxdxxxd"

表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时
匹配的结果是:成功;
匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。?
表达达式 "<td>(.*?)</td>" 匹配同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。

四、预搜索

(一)、正向预搜索(?=xx)(?!xx)

表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时
将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。
表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时
只能匹配中间的"do"。不会匹配done和dog中的do。

(二)、反向预搜索(?<=xx)(?<!xx)

表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时
将匹配除了前4个数字和后4个数字之外的中间8个数字,即56789012。

五、匹配标志

标志 说明
ignorecase 默认情况下,表达式中的字母是要区分大小写的。
配置为 Ignorecase 可使匹配时不区分大小写。
有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。
singleline 默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。
配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。
multiline 默认情况下,表达式 ^$ 只匹配字符串的开始 ① 和结尾 ④ 位置。
如:
①xxxxxxxxx②\n
③xxxxxxxxx④

配置为 Multiline 可以使 ^ 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置
使 $ 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。
global 主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。

六、常见正则表达式

上一篇 下一篇

猜你喜欢

热点阅读