我有一个基本上看起来像这样的正则表达式:
<(title|head)>(.*?)(String)(.*?<\/\1>我正在尝试使用名称组来标识部件
(?P<TITLE>(<(title|head)>))(.*?)(?P<NAME>(String))(.*?<\/\1>当我不使用标题名称组时,这是有效的:
(<(title|head)>)(.*?)(?P<NAME>(String))(.*?<\/\1>但是,当我使用标题名称组时,虽然我没有收到错误,但我突然失去了我的匹配。关于如何使用<>捕获正则表达式的部分,您有什么想法吗?我也尝试过转义>:
(?P<TITLE>(\<(title|head)\>))(.*?)(?P<NAME>(String))(.*?<\/\1>无济于事
发布于 2014-05-15 01:09:09
混合命名和编号捕获组的编号
支持命名捕获的正则表达式工具(Python、.NET、PCRE/PHP、perl5.10等)对混合命名和混合编号的采集分组进行不同的编号处理。.NET风格首先从左到右对所有编号的(未命名的)进行编号,然后返回并对命名的组进行编号。但是,PCRE/PHP在一次传递中从左到右统计命名和编号的捕获组。下面是您的正则表达式(修复了缺少的右括号),并以两种风格进行了完整注释,显示了混合捕获组的编号方式:
PCRE/PHP混合捕获编号示例:
$re_php = '%
# PCRE/PHP mixed capture numbering example.
(?P<TITLE> # $1: = $TITLE:
( # $2:
<(title|head)> # $3:
) # End $2:
) # End $1: = $TITLE:
(.*?) # $4:
(?P<NAME> # $5: = $NAME:
(String) # $6:
) # End $5: = $NAME:
(.*?) # $7:
</\1> # Error! Should be "\3".
%x';.NET混合捕获编号示例:
Regex re_csharp = new Regex(@"
# .NET mixed capture numbering example.
(?<TITLE> # $TITLE: = $6:
( # $1:
<(title|head)> # $2:
) # End $1:
) # End $TITLE: = $6:
(.*?) # $3:
(?<NAME> # $NAME: = $7:
(String) # $4:
) # End $NAME: = $7:
(.*?) # $5:
</\1> # Error! Should be '\2'.
", RegexOptions.IgnorePatternWhitespace);正如Tim所回避的那样,您的正则表达式还存在其他问题,但我不会在这里讨论这些问题。
底线:
最好不要将两种类型的捕获组混为一谈。使用全部命名捕获组或全部编号捕获组。你的生活会更美好!
也就是说,我强烈推荐阅读:Mastering Regular Expressions (3rd Edition),这是我收集上述信息的地方。(毫无疑问,这是我读过的最有用的书。)
Regexing快乐!
发布于 2014-05-14 23:09:11
如果从命名捕获组中删除该名称,它将成为编号捕获组(从左到右编号)。
这意味着\1将不再反向引用组(title|head),而是反向引用组(<(title|head)>),这当然会失败。
如果您将后向引用更改为\2,它应该可以再次工作(尽管您的正则表达式在语法上是无效的,缺少至少一个闭括号,所以我无法对其进行测试)。
https://stackoverflow.com/questions/23658449
复制相似问题