2

斯堪纳里奥

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

  • 字符串以“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 组是可选的。 演示

问题

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

有什么线索吗?

4

2 回答 2

3

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

n+将尽可能多地匹配n,如果我们希望减少它,我们必须添加后缀?

我在这里结束了这个正则表达式演示

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

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

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

于 2015-05-06T14:03:44.547 回答
2

对非捕获组使用 -xx 的更改,并使用?使+未准备好在-xx比赛中被吸收:

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

演示

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

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

演示 2

于 2015-05-06T14:03:26.690 回答