正后视中的原子组如何工作?
How does atomic group inside a positive lookbehind work?
我不明白为什么正则表达式 (?<=i:(?>\D*))\d
does not match 字符串 i:>1
.
我的理解方式:
- 在索引 0:lookbehind
i
不匹配
- 在索引 1:lookbehind
i:
不匹配
- 在索引 2:lookbehind
i:(?>\D*)
将匹配 i:
但 lookbehind 之后的 \d
将不匹配 >
- 在索引 3:lookbehind
i:(?>\D*)
将匹配 i:>
并且 lookbehind 之后的 \d
将匹配 1
-> 满足正则表达式
参见Regular Expressions Cookbook: Detailed Solutions in Eight Programming Languages:
.NET allows you to use anything inside lookbehind, and it will actually apply the regular expression from right to left. Both the regular expression inside the lookbehind and the subject text are scanned from right to left.
(?<=i:(?>\D*))\d
模式与 i:>1
中的 1
不匹配,因为原子组 (?>\D*)
阻止了对其模式的任何回溯。 i:
(实际上是 :
然后 i
被匹配)与 \D*
匹配,然后没有办法重新匹配 i:
作为原子组不允许回溯。
您还可以看到 (?<=i:(?>[^:\d]*))\d
will match 1
in i:>1
因为这里 [^:\d]*
匹配除 :
和数字以外的任何字符,因此只匹配 i:
和 i:
仍然有待匹配。
我不明白为什么正则表达式 (?<=i:(?>\D*))\d
does not match 字符串 i:>1
.
我的理解方式:
- 在索引 0:lookbehind
i
不匹配 - 在索引 1:lookbehind
i:
不匹配 - 在索引 2:lookbehind
i:(?>\D*)
将匹配i:
但 lookbehind 之后的\d
将不匹配>
- 在索引 3:lookbehind
i:(?>\D*)
将匹配i:>
并且 lookbehind 之后的\d
将匹配1
-> 满足正则表达式
参见Regular Expressions Cookbook: Detailed Solutions in Eight Programming Languages:
.NET allows you to use anything inside lookbehind, and it will actually apply the regular expression from right to left. Both the regular expression inside the lookbehind and the subject text are scanned from right to left.
(?<=i:(?>\D*))\d
模式与 i:>1
中的 1
不匹配,因为原子组 (?>\D*)
阻止了对其模式的任何回溯。 i:
(实际上是 :
然后 i
被匹配)与 \D*
匹配,然后没有办法重新匹配 i:
作为原子组不允许回溯。
您还可以看到 (?<=i:(?>[^:\d]*))\d
will match 1
in i:>1
因为这里 [^:\d]*
匹配除 :
和数字以外的任何字符,因此只匹配 i:
和 i:
仍然有待匹配。