首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带文字小于-大于括号的Namegroups

问使用带文字小于-大于括号的Namegroups
EN

Stack Overflow用户
提问于 2014-05-14 23:04:13
回答 2查看 26关注 0票数 0

我有一个基本上看起来像这样的正则表达式:

代码语言:javascript
复制
<(title|head)>(.*?)(String)(.*?<\/\1>

我正在尝试使用名称组来标识部件

代码语言:javascript
复制
(?P<TITLE>(<(title|head)>))(.*?)(?P<NAME>(String))(.*?<\/\1>

当我不使用标题名称组时,这是有效的:

代码语言:javascript
复制
(<(title|head)>)(.*?)(?P<NAME>(String))(.*?<\/\1>

但是,当我使用标题名称组时,虽然我没有收到错误,但我突然失去了我的匹配。关于如何使用<>捕获正则表达式的部分,您有什么想法吗?我也尝试过转义>:

代码语言:javascript
复制
(?P<TITLE>(\<(title|head)\>))(.*?)(?P<NAME>(String))(.*?<\/\1>

无济于事

EN

回答 2

Stack Overflow用户

发布于 2014-05-15 01:09:09

混合命名和编号捕获组的编号

支持命名捕获的正则表达式工具(Python、.NET、PCRE/PHP、perl5.10等)对混合命名和混合编号的采集分组进行不同的编号处理。.NET风格首先从左到右对所有编号的(未命名的)进行编号,然后返回并对命名的组进行编号。但是,PCRE/PHP在一次传递中从左到右统计命名和编号的捕获组。下面是您的正则表达式(修复了缺少的右括号),并以两种风格进行了完整注释,显示了混合捕获组的编号方式:

PCRE/PHP混合捕获编号示例:

代码语言:javascript
复制
$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混合捕获编号示例:

代码语言:javascript
复制
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快乐!

票数 1
EN

Stack Overflow用户

发布于 2014-05-14 23:09:11

如果从命名捕获组中删除该名称,它将成为编号捕获组(从左到右编号)。

这意味着\1将不再反向引用组(title|head),而是反向引用组(<(title|head)>),这当然会失败。

如果您将后向引用更改为\2,它应该可以再次工作(尽管您的正则表达式在语法上是无效的,缺少至少一个闭括号,所以我无法对其进行测试)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23658449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档