Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式,使用偶数/奇数次的字母_Regex_Word - Fatal编程技术网

Regex 正则表达式,使用偶数/奇数次的字母

Regex 正则表达式,使用偶数/奇数次的字母,regex,word,Regex,Word,线程的标题可能有点误导,但我没有找到更好的命名方法。我想找到一种使用正则表达式查找只包含字母x和y的单词的方法,但x必须使用偶数次,y必须使用奇数次。我知道如何使用两个正则表达式 此项检查是否有偶数个x(至少两个): 这一个检查是否有奇数的y(并且至少有一个): 两者都只匹配由x和y组成的字符串。我在编辑器中测试过: (?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*) 这将查找子字符串,因此您可能需要添加空格、行首和行尾字符:

线程的标题可能有点误导,但我没有找到更好的命名方法。我想找到一种使用正则表达式查找只包含字母x和y的单词的方法,但x必须使用偶数次,y必须使用奇数次。

我知道如何使用两个正则表达式

此项检查是否有偶数个x(至少两个):

这一个检查是否有奇数的y(并且至少有一个):


两者都只匹配由x和y组成的字符串。

我在编辑器中测试过:

(?=([^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),正则表达式将无法匹配剩下的单个x。 类似地,对于y的情况,它匹配所有y对,然后确保左一个y后跟所有非y。
我使用了?=以便匹配但不捕获,这样我们就可以检查x,然后在相同的字符串中检查y。

下面是一个经过测试的JavaScript示例函数,它实现了一个满足您需求的正则表达式。我假设零是一个可接受的(偶数)X数。正则表达式记录在多行注释中

函数具有偶数X奇数Y字(文本){
/*#!(?#!js\/i re_偶数x_奇数y版本:20170125_2100)
#具有偶数X和奇数Y的匹配字。
\锚定到单词的开头。
#首先断言该单词中Y的奇数、非零计数。
(?=#断言Y的奇数计数。
(?:#零个或多个Y对。
x*y#第一个y之前的可选x。
x*y#第二个y之前的可选x。
)*#结束零个或多个Y对。
x*yx*#最后(奇数)Y周围的可选x。
\锚定在单词的末尾。
)#结束断言Y的奇数计数。
#匹配X的偶数(可以是零=偶数)。
(?:#零个或多个X对。
y*x#可选y在第一个x之前。
y*x#可选y在第二个x之前。
)*#结束零个或多个X对。
y*#最后一个(偶数)X后可选y。
\锚定在单词的末尾。
!#*/
变量re_偶数x_奇数y=/\b(?=(?:x*yx*y)*x*yx*\b)(?:y*xy*x)*y*\b/i;
if(re_偶数x_奇数y.test(text)){return true;}
返回false;
}//End有_偶数_X_奇数_Y_单词()。

如果在传递的文本中找到匹配的单词,则函数返回true,否则返回false。

+请注意,您的两个正则表达式可以合并为一个(请参阅我答案中的注释版本)。
(?=([^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]