我需要扩展现有的正则表达式来捕获一些可选的前缀。 我目前的正则表达式工作正常:
(?:\b)(?:mon|tue|wed|thu|fri|sat|sun)(?:\b)
并匹配由单词边界分隔的任何单词。
例如,给定字符串"mon-sun.sat"
,它将分别与mon
,sun
和sat
匹配。
现在,请说上面的字词可以选择以"each" "only" "any"
之类的字词为前缀,例如"mon. any-tue or only-wed. sat. each weekend"
我想扩展我的正则表达式以匹配和捕获(在上面的示例中),术语mon
any tue
only wed
sat
,但显然不是each
因为没有为列表的术语添加前缀。实际上,要捕获的模式是:可选prefix
后跟day of the week
。
我试过用几种方法扩展我的正则表达式但没有成功。我想我正在弄乱边界这个词。
换句话说:
有两组单词P={each,only,any}
和W={mon,tue,wed,thu,fri,sat,sun}
。我需要匹配任何元素w in W
,可选地以元素p in P
为前缀。分隔符可以是任何\ b。
编辑:
我目前的尝试是
(:?\b) ((any|only|each)?(:?\b)) (:?mon|tue|wed|thu|fri|sat|sun) (:?\b)
但只会与mon
tue
wed
sat
匹配。
答案 0 :(得分:3)
您可以使用
\b(?:(any|only|each)\W+)?(mon|tue|wed|thu|fri|sat|sun)\b
请参阅regex demo
<强>详情:
\b
- 领先的单词边界(?:(any|only|each)\W+)?
- 一个可选的非捕获组,匹配1或0次出现:
(any|only|each)
- 一个完整的单词(前导词边界已经与上面的\b
断言,并且尾随的单词边界由\W+
)any
保证, only
每个`\W+
- 一个或多个非单词字符。(mon|tue|wed|thu|fri|sat|sun)\b
- 整个单词(由于捕获组之后的初始\b
或\W+
和\b
):mon
,{{ 1}},tue
,wed
,thu
,fri
或sat
。请注意,sun
非捕获组用于包装可选的子模式,因为与捕获组相比,它不会为捕获创建任何内存缓冲区。 (?:...)?
是量词,使其匹配组内子模式序列的1或0次出现。 ?
是一个非单词char速记字符类,它使用任何非单词char(因此,任何标点和符号,甚至空格都将匹配)。