捕获匹配组的子字符串

时间:2015-05-06 13:56:12

标签: regex lookahead capturing-group

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定义匹配,因为它是带有破折号的字母字符串。因此,生成的捕获字符串不会排除后缀。

有任何线索吗?

2 个答案:

答案 0 :(得分:3)

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

n+将匹配尽可能多的n,如果我们希望减少此项,我们必须使用?后缀

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

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

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

我认为两者之间没有任何争论,我认为。

答案 1 :(得分:2)

对非捕获组使用-xx的更改,并使用?使+不准备好在匹配中吸引-xx

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

Demo

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

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

Demo 2