正则表达式匹配以y或z结尾的单词,但两者结合在一起

时间:2017-06-14 18:20:25

标签: regex

我正在寻找一个正则表达式,它匹配以y或z结尾的单词,但不能同时匹配。

以下是一些测试用例:

fez day fyyyz fyyzy
  • 匹配fez
  • 匹配day
  • fyyyz
  • 结束时不匹配yz
  • fyyzy
  • 结束时不匹配zy

我正在尝试这个正则表达式,但它不起作用。

  

[yz\b]

我正在使用的正则表达式工具是 - http://www.regexr.com/

4 个答案:

答案 0 :(得分:4)

您可以使用

\b\w*[yz]\b(?<!yz)

或 - 如果该字词不能以yzzy结尾:

\b\w*[yz]\b(?<!yz|zy)

它匹配以yz结尾的任何字词,但不匹配yyz(或(?<!yz|zy),而不是以yz或{{1 }})。

请参阅regex demo

请注意,方括号内的zy不是单词边界,而是退格匹配转义序列。

模式详细信息

  • \b - 领先的字边界
  • \b - 0个单词字符(字母,数字或\w*,可以调整为仅匹配_字母)
  • [^\W\d_]* - [yz]y
  • z - 尾随字边界
  • \b - 如果在当前位置之前有一个(?<!yz)字符序列,则会导致匹配失败的负面观察。

编辑:现在,删除了所有Perl,Python和Java标记,它也可能吸引那些想要在 VBA,C ++中使用正则表达式的人的注意力{{1 (默认风格为ECMAScript5)或 JavaScript ,其正则表达式引擎( ECMA-5标准)不支持lookbehinds,但支持前瞻。

您可以使用

yz

请参阅regex demo

<强>详情:

  • std::regex - 领先的字边界
  • /\b(?!\w*(?:yz|zy)\b)\w*[yz]\b/ - 在找到单词边界后立即执行的否定前瞻,如果在0+单词字符后,如果跟随\b(?!\w*(?:yz|zy)\b),则匹配将失败尾随单词边界
  • yz - 消耗0+字chars
  • zy - \w*[yz]
  • y - 尾随字边界。

答案 1 :(得分:2)

\b\w*[yz](?<!(?:yz|zy))\b

试试这个.Lookbehind将确保你没有yz or zy作为结束。参见演示。

https://regex101.com/r/Gtplnq/1

答案 2 :(得分:1)

如果您的单词长度不是1,请使用:

/\b\w*(?:[^z]y|[^y]z)\b/

RegEx Demo 1

如果你也可以有1个字符的单词,那么你可以使用这个负面的超前正则表达式:

/\b(?!\w*(?:yz|zy)\b)\w*[yz]\b/

RegEx Demo 2

答案 3 :(得分:1)

另一种方式,没有外观:

/\w*(?:[^y]z|[^z]y)\b/

Example