斯堪纳里奥

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


字符串以“ section1:”开头
捕获的字符串可以是字母数字值的空格分隔或破折号分隔的列表
如果捕获的字符串以特定的后缀('-xx')结尾,请从捕获的字符串中排除该后缀。


例子

第1节:ypsilon:第1节比赛,抓住“ ypsilon”

第1节:ypsilon zeta:第1节比赛,抓住“ ypsilon zeta”

第1节:ypsilon-zeta:第1节比赛,抓住“ ypsilon-zeta”

第1节:ypsilon-xx:第1节匹配,抓取“ ypsilon”,排除“ -xx”

第1节:ypsilon zeta-xx:第1节比赛,抓取“ ypsilon zeta”,排除“ -xx”

第1节:ypsilon-zeta-xx:第1节比赛,抓取“ ypsilon-zeta”,排除“ -xx”

第2节:ypsilon:第2节不匹配

到目前为止的解决方案

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


想法是获得组1,而组2是可选的。
Demo



不幸的是,后缀与group1定义匹配,因为它是带破折号的字母字符串。因此,捕获的结果字符串不排除后缀。

有什么线索吗?

最佳答案

亲密无间,您面临的主要问题是操作员的贪婪程度。

n+将与尽可能多的n匹配,如果我们想减小此值,我们必须在其后缀?

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

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


主要区别是在?之后的+使它变得非贪婪(或不情愿),我更喜欢在空和期望后缀之间使用替代,而不是使用组(|-xx)来代替,这在末尾之前不匹配或-xx行。

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

10-05 22:20