Skip to content

Latest commit

 

History

History
85 lines (79 loc) · 9.68 KB

正则表达式.md

File metadata and controls

85 lines (79 loc) · 9.68 KB

什么是正则表达式

正则表达式是一种用来描述一定数量文本的语言表达方法,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} mn均为非负整数,其中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>)
  • href="//item.jd.com/1865339.html" --> 1865339
    • Regex: (?<=href="//item.jd.com/)\d+(?=.html")

T命名捕获组

当原始内容中包含多个重复文本片段,可使用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>

匹配模式前缀

  • 单行模式 (?s)
    • 更改 . 的含义,使之可以匹配换行符 \n,即可实现对内容的跨行匹配
  • 不区分大小写模式 (?i)
  • 多行模式 (?m)
    • 表示更改 ^$ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。
    • 在此模式下,$ 匹配 \n 之前的位置以及字符串结束前的位置。^ 匹配 \n 之后的位置以及字符串开始的位置。