关于正则表达式的几种区匹配不太理解

来源:百度知道 编辑:UC知道 时间:2024/05/12 11:37:21
第1个问题:
Regex格式:(?>expression)
官方的说法是:只匹配字符串expression一次.不懂~``
来两个例子:
\w\d\w 和 \w(?>\d)\w
\w(?>\d)?\w 和 \w(\d)?\w
这两对区别在哪?好像每对都能匹配一样的东东..-_=``/$%^&*(*&!
第2个问题:
\G属于元字符么?怎么用?
官方的说法是:匹配必须出现在上一个匹配结束的地方
我读不明白~`
第3个问题:
(?<-name>expression)
官方的说法是:从堆栈中弹出最后压入的命名为name的匹配内容,如果堆栈为空,则当前组匹配失败。
我的理解是:如果匹配到expression则弹出堆栈中的name内容,再与expression组合成组去匹配。可是例题和我的理解好像不一样..,顺便请高手指点一下嵌套字符串如何用递归匹配.
个例子
具个例子:
递归匹配用于嵌套字符串时该怎么用`?
再来个例子:
Regex:\([^()]*(((?<liu>\()[^()]*)+((?<-liu>\))[^()]*)+)*(?(liu)(?!))\)
Source:((5+20)*(20%80))
Matches:((5+20)*(20%80))
[^()]* #匹配最外层左括号后面不是括号的内容,这里为什么还可以匹配到((
(?<-liu>\)) #如果碰到右边的括号,就弹出前面放进去的liu,如果弹出的话不成了()了么?怎么匹配(20%80)

烦请有能力帮我解答的高人针对我的提问手敲打字解答

问题1:
一次性子模式(Once-only subpatterns)

关于量词的另一个有趣的话题是一次性子模式(Once-only subpatterns)。要理解它的概念需要先了解一下含有量词的正则表达式的匹配过

程。我们这里举个例子。

现在,让我们用模式/\d+foo/来匹配字符串“123456bar”,当然,它的结果是没有匹配。但正则表达式引擎是如何工作的呢?它先分析前

面的\d+,这代表一个以上的数字,然后检查目标字符串的对应位置的第一个字符“1”,符合模式,然后根据量词重复这个模式对字符串进行

匹配直到“123456”始终符合“\d+”模式,接着它在目标字符串中遇到字符“b”无法与“\d+”匹配,于是查看“\d+”的后续模式“foo”,

与目标字符串的后续部分“bar”无法匹配,这时,有趣的事情出现了,解释引擎会对前面已经解析过的“\d+”模式进行回溯,将量词数目减

少一,看剩余部分能否匹配,此时“\d+”的值改为“12345”,然后解释引擎看目标字符串剩余的部分“6bar”能否与剩余的模式“foo”相匹

配,如果不行,就把量词数再减一,直到达到最小的量词限制,如果仍无法匹配,则表明目标字符串无法匹配,返回无法匹配的结果。

现在,我们就可以来接触一次性子模式了。所谓一次性子模式就是定义在正则表达式解析时不需要上述回溯过程的子模式。它用左圆括号

后面的问号和大于号来表示,向这样(?>)。如果将上面提到的例子改为一次性子模式,可以这样书写:

/(?>\d)+foo/,这时,当解析器遇到后面不匹配的bar时,会立即返回不匹配的结果,而不会进行前面提到的回溯过程。

需要了解的是,一次性子模式属于非捕获子模式,它的匹配结果不能被逆向引用。

当一个没有设定重复上限的子模式中包含了同样没有设定重复上限的模式时,使用一次性子模式是唯一可以避免让你的程序陷入长时间等