共计 1187 个字符,预计需要花费 3 分钟才能阅读完成。
*. 分组
说匹配次数之前,先说说其余的。
应用圆括号 () 包裹字符内容,使其变成一个子表达式,执行匹配后,除了总匹配后果,子表达式匹配后果也会存入内存。
这里括号的作用和四则运算中括号中的作用差不多,括号内的运算具备更高的优先级,并作为一个整体参加匹配运算。
1. 用元字符确定匹配次数
通过在单个字符或一个子表达式的前方,紧跟示意匹配次数的元字符,确定这个字符或者子表达式该当间断匹配的次数。
1. ?
?
示意匹配 0 次或者 1 次,即要匹配的内容可有可无。
例如正则表达式 (www\.)?sss.com
,既能够匹配字符串 www.sss.com
,也能够匹配 sss.com
。
2. *
*
示意匹配 0 次或者屡次,即匹配多少次都行。
例如正则表达式 ax*b
,能够匹配字符串 ab
、axb
、axxxxb
、axxxxxxxxxxxb
等。
3. +
+
示意匹配 1 次或者屡次,即匹配多少次都行,然而至多得有一次。
例如正则表达式 ax+b
,能够匹配字符串 axb
、axxxxb
、axxxxxxxxxb
等,然而不能匹配 ab
。
4. 花括号
应用花括号包裹自然数,来示意匹配的次数({m}
)。能够在两个自然数两头加上逗号来示意匹配两个数的区间范畴 ({m, n}
)。
如果花括号内只有第一个自然数和一个逗号,则示意匹配 >= 第一个数的次数({m,}
)。
例如:ce{3}b
只能够匹配字符串 ceeeb
,ce{1,3}b
只能够匹配字符串 ceb
、ceeb
、ceeeb
,ce{3,}b
能够匹配字符串 ceeeb
、ceeeeeeeb
、ceeeeeeeeeeeeeeeb
等,但不能匹配字符串ceb
、ceeb
。
2. 贪心模式与非贪心模式
在一个正则表达式中,一个字符对应的字符集越大,则满足匹配的状况就越多。如果这个字符的匹配次数越大,那么字符串中满足匹配的状况就越多。这个时候,最终的匹配后果应该如何抉择呢?
比方,用正则表达式 a.*b
去匹配字符串 abccbxxb
,匹配后果应该是 ab
、abccb
还是 abccbxxb
?
这个时候,须要依据贪心模式或者非贪心模式去判断。
贪心模式(默认模式),就是说,在满足正则匹配的状况下,取字符数最多的那个后果。
非贪心模式,即反之,取字符数起码的那个后果。应用办法为,在示意匹配次数的元字符后加上一个 ?
。
依据下面的概念,之前的问题,答案应该是 abccbbxxb
。
如果想要应用非贪心模式来匹配出 ab
,则应该批改正则表达式为 a.*?b
。
咱们来看一个更贴近事实的例子。咱们要取出一段 HTML 中 a 标签所蕴含的链接。
假如这段 HTML 为:
<a href="a.com"></a><div class="one">
如过咱们应用正则表达式 ".*"
去匹配,则后果为 "a.com"></a><div class="one"
。因为贪心模式,匹配到了最长的字符串。
因而,应该应用 ".*?"
去匹配,后果为 "a.com"
。这时,正确匹配到 a 标签中蕴含的链接(尽管有两个引号的)。