斯堪纳里奥
我必须从组合字符串中获取一个子字符串。
匹配条件:
字符串以“ 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
行。我认为两者之间没有争议,我认为是口味问题。