捕获匹配组的子字符串

Capture a substring of a matched group

Scanario

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

例子

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 定义相匹配,因为它是一个带有破折号的字母字符串。所以得到的捕获字符串不排除后缀。

有线索吗?

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

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

Demo

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

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

Demo 2

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

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

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

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

主要区别是 + 之后的 ? 使其不贪婪(或不情愿),我更喜欢使用 empty 和 desire 后缀之间的交替而不是组 (|-xx) 这与行尾之前的任何内容或 -xx 都不匹配。

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