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定义匹配,因为它是带有破折号的字母字符串。因此,生成的捕获字符串不会排除后缀。
有任何线索吗?
答案 0 :(得分:3)
你很亲密,你面临的主要问题是运营商的贪婪。
n+
将匹配尽可能多的n
,如果我们希望减少此项,我们必须使用?
后缀
我最终得到了这个正则表达式Demo here
^section1:([a-zA-Z0-9\- ]+?)(|-xx)$
主要区别是?
后+
使其变得非贪婪(或不情愿),我更喜欢使用空格和欲望后缀而不是组(|-xx)
之间的交替在行尾之前没有匹配OR -xx
。
我认为两者之间没有任何争论,我认为。
答案 1 :(得分:2)