【问题标题】:Capture a substring of a matched group捕获匹配组的子字符串
【发布时间】:2015-07-16 17:15:36
【问题描述】:

Scanario

我必须从组合字符串中获取子字符串。 匹配条件:

  • 字符串以'section1:'开头

  • 捕获的字符串可以是空格分隔或破折号分隔的字母数字值列表

  • 如果捕获的字符串以特定后缀('-xx')结尾,则从捕获的字符串中排除该后缀。

示例

section1:ypsilon : 第 1 部分匹配,抓取 'ypsilon'

section1:ypsilon zeta : 第 1 部分匹配,抓取 'ypsilon zeta'

section1:ypsilon-zeta : 第 1 部分匹配,抓取 'ypsilon-zeta'

section1:ypsilon-xx:第 1 节匹配,抓取 'ypsilon',排除 '-xx'

section1:ypsilon zeta-xx:第 1 部分匹配,抓取 'ypsilon zeta',排除 '-xx'

section1:ypsilon-zeta-xx:第 1 部分匹配,抓取 'ypsilon-zeta',排除 '-xx'

section2:ypsilon : 第 2 节不匹配

目前的解决方案

^section1:([a-zA-Z0-9\- ]+)(\-xx)?$

这个想法是获得第 1 组,而第 2 组是可选的。 Demo.

问题

不幸的是,后缀与 group1 定义匹配,因为它是一个带有破折号的字母字符串。所以生成的捕获字符串不排除后缀。

有什么线索吗?

【问题讨论】:

    标签: regex lookahead capturing-group


    【解决方案1】:

    你很亲密,你面临的主要问题是运营商的贪婪。

    n+ 将匹配尽可能多的n,如果我们想减少它,我们必须在它后面加上?

    我最终得到了这个正则表达式Demo here

    ^section1:([a-zA-Z0-9\- ]+?)(|-xx)$
    

    主要区别是+ 之后的? 使其不贪婪(或不情愿),我更喜欢在空和欲望后缀之间使用交替而不是组(|-xx) 这个匹配没有或-xx在行尾之前。

    我认为两者之间没有争论,我认为是口味问题。

    【讨论】:

      【解决方案2】:

      对非捕获组使用 -xx 的更改并使用 ? 使 + 没有准备好以致 -xx 在比赛中被吸走:

      (?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|:)
      

      Demo

      如果您没有第二个: 用作书签,请使用$

      (?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|\s*$)
      

      Demo 2

      【讨论】:

      • 非贪心运算符值得说一下,不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2021-06-21
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多