[正则表达式]基础工具书篇 匹配次数
Posted wei4118268
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[正则表达式]基础工具书篇 匹配次数相关的知识,希望对你有一定的参考价值。
*. 分组
说匹配次数之前,先说说其他的。
使用圆括号 ( ) 包裹字符内容,使其变成一个子表达式,执行匹配后,除了总匹配结果,子表达式匹配结果也会存入内存。
这里括号的作用和四则运算中括号中的作用差不多,括号内的运算具有更高的优先级,并作为一个整体参与匹配运算。
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标签中包含的链接(虽然有两个引号的)。
以上是关于[正则表达式]基础工具书篇 匹配次数的主要内容,如果未能解决你的问题,请参考以下文章