线程的标题可能有点误导,但我没有找到更好的方法来命名它。我想找到一种方法,使用正则表达式来查找仅包含字母x和y的单词,但x必须使用偶数次,y必须使用奇数次。
答案 0 :(得分:1)
我知道如何用两个正则表达式来做到这一点。
这个检查是否有偶数x(和至少两个):
/^(y*xy*x)+y*$/
这个检查是否存在奇数个y(并且至少有一个):
/^(x*yx*y)*x*yx*$/
两者仅匹配仅由x和y组成的字符串。
答案 1 :(得分:0)
我已经在我的编辑中对此进行了测试:
(?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)
这将找到子字符串,因此您可能希望添加空格,开头,行尾字符:
[^\s](?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)[$\s]
要将其分解,[^x]*x[^x]*x[^x]*
将抓取所有not-x,直到它找到第一个x,然后抓取任何跟随非x的内容,直到找到第二个x,然后再次抓取其他任何内容直到另一个x 。它包含在()*中,以便重复无限次,以便找到所有x对。如果剩下奇数x(奇数x' s),正则表达式将无法匹配单个x左边。
类似地,对于y情况,它匹配所有y对,然后确保剩下一个y,然后是所有not-y' s。
我使用?=使它匹配但不捕获,这样我们就可以检查x'然后在相同的字符串中检查y' s。
答案 2 :(得分:0)
这是一个经过测试的JavaScript示例函数,它实现了一个符合您要求的正则表达式。我假设零是可接受的(偶数)X数。正则表达式记录在多行注释中。
function has_even_X_odd_Y_word(text) {
/*#!(?#!js\/i re_even_x_odd_y Rev:20170125_2100)
# Match word having even count of X and odd count of Y.
\b # Anchor to start of word.
# First assert odd, non-zero count of Ys in this word.
(?= # Assert odd count of Y.
(?: # Zero or more or more Y pairs.
x*y # Optional Xs preceeding 1st Y.
x*y # Optional Xs preceeding 2nd Y.
)* # End zero or more Y pairs.
x*yx* # Optional Xs around last (odd) Y.
\b # Anchor to end of word.
) # End assert odd count of Y.
# Match even number of Xs (can be zero = even).
(?: # Zero or more X pairs.
y*x # Optional Ys preceeding 1st X.
y*x # Optional Ys preceeding 2nd X.
)* # End zero or more X pairs.
y* # Optional Ys after last (even) X.
\b # Anchor to end of word.
!#*/
var re_even_x_odd_y = /\b(?=(?:x*yx*y)*x*yx*\b)(?:y*xy*x)*y*\b/i;
if (re_even_x_odd_y.test(text)) { return true; }
return false;
} // End has_even_X_odd_Y_word().
如果在传递的文本中找到匹配的单词,则该函数返回true,否则返回false。