正则表达式是一种用来描述一定数量文本的语言表达方法,Regex代表Regular Expression。
一個正则表达式通常被稱為一個模式(pattern),為用来描述或者匹配一系列符合某个句法规则的字符串。例如:Handel、Händel和Haendel這三个字符串,都可以由「H(a|ä|ae)ndel
」这个模式来描述。大部分正则表达式的形式都有如下的结构:
- 选择
|
竖直分隔符代表选择。例如「gray|grey
」可以匹配grey或gray。
- 数量限定
- 某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”、“?”和“*”(不加数量限定则代表出现一次且仅出现一次):
+
加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,「goo+gle
」可以匹配google、gooogle、goooogle等;?
问号代表前面的字符最多-{}-只可以出现一次。(0次、或1次)。例如,「colou?r
」可以匹配color或者colour;*
星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,「0*42
」可以匹配42、042、0042、00042等。
- 匹配
- 圆括号可以用来定义操作符的范围和优先度。例如,「
gr(a|e)y
」等价于「gray|grey
」,「(grand)?father
」匹配father和grandfather。 上述这些构造子都可以自由组合,因此,「H(ae?|ä)ndel
」和「H(a|ae|ä)ndel
」是相同的。
- 圆括号可以用来定义操作符的范围和优先度。例如,「
字符 | 描述 |
---|---|
\ |
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,「n 」匹配字符「n 」。「\n 」匹配一个换行符。序列「\\ 」匹配「\ 」而「\( 」则匹配「( 」。 |
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配「\n 」或「\r 」之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配「\n 」或「\r 」之前的位置。 |
* | 匹配前面的子表达式零次或多次。例如,zo*能匹配「z 」、「zo 」以及「zoo 」。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,「zo+ 」能匹配「zo 」以及「zoo 」,但不能匹配「z 」。+等价于{1,}。 |
? | 匹配前面的子表达式零次或一次。例如,「do(es)? 」可以匹配「do 」或「does 」中的「do 」。?等价于{0,1}。 |
{n } |
n 是一个非负整数。匹配确定的n 次。例如,「o{2} 」不能匹配「Bob 」中的「o 」,但是能匹配「food 」中的两个o。 |
{n ,} |
n 是一个非负整数。至少匹配n 次。例如,「o{2,} 」不能匹配「Bob 」中的「o 」,但能匹配「foooood 」中的所有o。「o{1,} 」等价于「o+ 」。「o{0,} 」则等价于「o* 」。 |
{n ,m } |
m 和n 均为非负整数,其中n <=m 。最少匹配n 次且最多匹配m 次。例如,「o{1,3} 」将匹配「fooooood 」中的前三个o。「o{0,1} 」等价于「o? 」。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n },{n ,},{n ,m })后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串「oooo 」,「o+? 」将匹配单个「o 」,而「o+ 」将匹配所有「o 」。 |
. | 匹配除「\n 」之外的任何单个字符。要匹配包括「\n 」在内的任何字符,请使用像「`(. |
(pattern) | 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括號字符,请使用「\( 」或「\) 」。 |
(?:pattern) | 匹配pattern但不获取匹配的子字符串,也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符「`( |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,「`Windows(?=95 |
(?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如「`Windows(?!95 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类似,只是方向相反。例如,「`(?<=95 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。例如「`(?<!95 |
x | y |
[xyz] | 字符集合(character class)。匹配所包含的任意一个字符。例如,「[abc] 」可以匹配「plain 」中的「a 」。特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。 |
[^xyz] | 排除型(negate)字符集合。匹配未列出的任意字符。例如,「[^abc] 」可以匹配「plain 」中的「plin 」。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,「[a-z] 」可以匹配「a 」到「z 」范围内的任意小写字母字符。 |
[^a-z] | 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,「[^a-z] 」可以匹配任何不在「a 」到「z 」范围内的任意字符。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,「er\b 」可以匹配「never 」中的「er 」,但不能匹配「verb 」中的「er 」。 |
\B | 匹配非单词边界。「er\B 」能匹配「verb 」中的「er 」,但不能匹配「never 」中的「er 」。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的「c 」字符。 |
\d | 匹配一个数字字符。等价于[0-9]。 |
\D | 匹配一个非数字字符。等价于[^0-9]。 |
\f | 匹配一个换页符。等价于\x0c和\cL。 |
\n | 匹配一个换行符。等价于\x0a和\cJ。 |
\r | 匹配一个回车符。等价于\x0d和\cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于\x09和\cI。 |
\v | 匹配一个垂直制表符。等价于\x0b和\cK。 |
\w | 匹配包括下划线的任何单词字符。等价于「[A-Za-z0-9_] 」。 |
\W | 匹配任何非单词字符。等价于「[^A-Za-z0-9_] 」。 |
片段 | 描述 | 举例 |
---|---|---|
.+ |
匹配任意长度字符串 | |
\d+ |
匹配任意长度数字 | 012324 |
[\W\w\d]+ |
匹配任意长度英文+数字 | w034AZ334 |
[\u4E00-\u9FA5]+ |
匹配任意长度中文 | |
[\w\d-\.]+@[\w\d-]+\.[\w\d]+ |
匹配邮箱 | |
\"ctime\":(?<T>\\d+)(?!.*ctime) |
匹配最后一个ctime的值 |
灵活使用 (?<=pattern)
和 (?=pattern)
可实现精确匹配,示例:
<font class="skcolor_ljg">ABC</font> 2014 750ml</em>
-->ABC
- Regex:
(?<=<font class="skcolor_ljg">).+?(?=</font> 2014 750ml</em>)
- Regex:
href="//item.jd.com/1865339.html"
-->1865339
- Regex:
(?<=href="//item.jd.com/)\d+(?=.html")
- Regex:
当原始内容中包含多个重复文本片段,可使用T命名捕获组(pattern)(?<T>pattern)(pattern)
进行匹配,可以更精确获得所需结果,示例:
<tr><td>2231</td><td>Beijing</td><td>测试</td></tr>
-->Beijing
- Regex:
<tr><td>.+?</td><td>(?<T>.+?)</td><td>.+?</td></tr>
- Regex:
- 单行模式
(?s)
- 更改
.
的含义,使之可以匹配换行符\n
,即可实现对内容的跨行匹配
- 更改
- 不区分大小写模式
(?i)
- 多行模式
(?m)
- 表示更改
^
和$
的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。 - 在此模式下,
$
匹配\n
之前的位置以及字符串结束前的位置。^
匹配\n
之后的位置以及字符串开始的位置。
- 表示更改