我正在寻找一个正则表达式,它匹配以y或z结尾的单词,但不能同时匹配。
以下是一些测试用例:
fez day fyyyz fyyzy
fez
day
fyyyz
yz
fyyzy
zy
我正在尝试这个正则表达式,但它不起作用。
[yz\b]
我正在使用的正则表达式工具是 - http://www.regexr.com/
答案 0 :(得分:4)
您可以使用
\b\w*[yz]\b(?<!yz)
或 - 如果该字词不能以yz
或zy
结尾:
\b\w*[yz]\b(?<!yz|zy)
它匹配以y
或z
结尾的任何字词,但不匹配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)
答案 2 :(得分:1)
如果您的单词长度不是1,请使用:
/\b\w*(?:[^z]y|[^y]z)\b/
如果你也可以有1个字符的单词,那么你可以使用这个负面的超前正则表达式:
/\b(?!\w*(?:yz|zy)\b)\w*[yz]\b/
答案 3 :(得分:1)