I am looking for a regular expression which matches words ending with y or z, but not both together.
Here are some test cases:
fez day fyyyz fyyzy
fezdayfyyyz as it ends in yzfyyzy as it ends in zyI was trying this regular expression, but it isn't working.
[yz\b]
Regex Tool I am using is - http://www.regexr.com/
You may use
\b\w*[yz]\b(?<!yz)
or - if the word can't end with yz OR zy:
\b\w*[yz]\b(?<!yz|zy)
It matches any word ending with y or z, but not yyz (or with (?<!yz|zy), not those ending with yz or zy).
See the regex demo
Note that \b inside square brackets is not a word boundary, but a backspace matching escape sequence.
Pattern details
\b - leading word boundary\w* - 0+ word chars (letters, digits or _, it can be adjusted to match just letters with [^\W\d_]*)[yz] - a y or z\b - trailing word boundary(?<!yz) - a negative lookbehind that fails the match if there is a yz char sequence immediately before the current location.EDIT: Now, that all Perl, Python and Java tags are removed, it might also attract the attention of people who would like to use the regex in VBA, C++ std::regex (default flavor of which is ECMAScript5), or JavaScript whose regex engines (ECMA-5 standard) does not support lookbehinds, but do support lookaheads.
You may use
/\b(?!\w*(?:yz|zy)\b)\w*[yz]\b/
See the regex demo.
Details:
\b - leading word boundary(?!\w*(?:yz|zy)\b) - a negative lookahead that is executed right after finding a word boundary, and it will fail the match if after 0+ word chars, there is either yz or zy followed with the trailing word boundary\w* - consuming the 0+ word chars[yz] - y or z\b - trailing word boundary.If your word are not 1 in length then use:
/\b\w*(?:[^z]y|[^y]z)\b/
RegEx Demo 1
If you can have 1 character word as well then you can use this negative lookahead regex:
/\b(?!\w*(?:yz|zy)\b)\w*[yz]\b/
RegEx Demo 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With