使用可选的prefiex捕获单词

时间:2017-05-09 09:55:56

标签: regex

我需要扩展现有的正则表达式来捕获一些可选的前缀。 我目前的正则表达式工作正常:

(?:\b)(?:mon|tue|wed|thu|fri|sat|sun)(?:\b)

并匹配由单词边界分隔的任何单词。 例如,给定字符串"mon-sun.sat",它将分别与monsunsat匹配。

现在,请说上面的字词可以选择以"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匹配。

1 个答案:

答案 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}},tuewedthufrisat

请注意,sun非捕获组用于包装可选的子模式,因为与捕获组相比,它不会为捕获创建任何内存缓冲区。 (?:...)?是量词,使其匹配组内子模式序列的1或0次出现。 ?是一个非单词char速记字符类,它使用任何非单词char(因此,任何标点和符号,甚至空格都将匹配)。