我有一些测试字符串:
我想制作一个正则表达式,它应该匹配字符串1,2,3,4而不是5。
所以我的比赛限制是:
注意:-我只需要一个正则表达式来解决此问题。因为使用单独的正则表达式和迭代,我已经做到了。我正在寻找单行解决方案来验证我的字符串。
我尝试过的解决方案是:
/(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/
但是它也匹配第5种情况。
答案 0 :(得分:2)
您可以使用
/^(?!.*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/
请参见regex demo。
详细信息
^
-字符串的开头(?!.*\b([xym])\1*\b.*\b\1+\b)
-如果在字符串开始后立即出现匹配,则负匹配将使匹配失败
.*
-除换行符之外的任意0+个字符,并且尽可能多\b([xym])\1*\b
-由相同的字符x
,y
或m
.*
-除换行符之外的任意0+个字符,并且尽可能多\b\1+\b
-由第1组中捕获的一个字符组成的整个单词(?:\s*\b([xym])\2*\b)*
-重复0次或更多次
\s*
-0个或更多空白字符\b([xym])\2*\b
-由1个或多个相同字符,x
,y
或m
组成的整个单词\s*
-0个或更多空白字符$
-字符串的结尾。