捕获匹配组的子字符串
Capture a substring of a matched 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 定义相匹配,因为它是一个带有破折号的字母字符串。所以得到的捕获字符串不排除后缀。
有线索吗?
对非捕获组使用 -xx 的改变,并使用 ?
使 +
没有准备好以至于 -xx
在比赛中被吸走:
(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|:)
如果您没有第二个 :
用作书签,请使用 $
:
(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|\s*$)
你很接近,你面临的主要问题是运营商的贪婪。
n+
将匹配尽可能多的 n
,如果我们希望减少它,我们必须在其后缀 ?
我最终得到了这个正则表达式 Demo here
^section1:([a-zA-Z0-9\- ]+?)(|-xx)$
主要区别是 +
之后的 ?
使其不贪婪(或不情愿),我更喜欢使用 empty 和 desire 后缀之间的交替而不是组 (|-xx)
这与行尾之前的任何内容或 -xx
都不匹配。
我认为两者之间没有争论,我认为是品味问题。
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 定义相匹配,因为它是一个带有破折号的字母字符串。所以得到的捕获字符串不排除后缀。
有线索吗?
对非捕获组使用 -xx 的改变,并使用 ?
使 +
没有准备好以至于 -xx
在比赛中被吸走:
(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|:)
如果您没有第二个 :
用作书签,请使用 $
:
(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|\s*$)
你很接近,你面临的主要问题是运营商的贪婪。
n+
将匹配尽可能多的 n
,如果我们希望减少它,我们必须在其后缀 ?
我最终得到了这个正则表达式 Demo here
^section1:([a-zA-Z0-9\- ]+?)(|-xx)$
主要区别是 +
之后的 ?
使其不贪婪(或不情愿),我更喜欢使用 empty 和 desire 后缀之间的交替而不是组 (|-xx)
这与行尾之前的任何内容或 -xx
都不匹配。
我认为两者之间没有争论,我认为是品味问题。