我目前正在制作一个计划。我需要一个带有Y和X的正则表达式,并且X对由Y分隔。它不必是相等的数字,但它不能包含彼此相对的多个X'。
示例:
# Don't match:
XXXYYYYY
#Match:
XYXYYYY
X
到目前为止我的尝试:
{Y*[X|^X]Y*[X|^X]Y*}*
问题是,如果第一个中有X而第二个中有X,则Y仍然可以为0.我可以直接测试双X吗?
答案 0 :(得分:3)
由于上面的答案使用了前瞻,这个答案提供了一个vanilla正则表达式的解决方案:
^(X?Y)*X?$
上面的解决方案假设允许空字符串。否则:
^((X?Y)+X?|X)$
(随意使群体不被捕获)
感谢Unihedron简化XY|Y
至X?Y
。
如果有人对此答案的有效性仍有疑问,solve the below equations:
R1 = XR2 + YR3 + λ
R2 = YR3 + λ
R3 = XR2 + YR3 + λ
DFA可以从上面的等式中得出。
如果不允许空字符串,请删除+ λ
中的R1
。
答案 1 :(得分:2)
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用此模式:
^Y*(XY+)*X?$
如果你想确保至少有一个字符,你可以单独检查长度或在开头添加一个前瞻:
^(?=.)Y*(?:XY+)*X?$
关于灾难性的回溯:
如果您使用DFA正则表达式引擎,则没有任何问题,因为没有回溯。
如果您使用NFA正则表达式引擎,可以通过多种方式防止灾难性回溯,例如:
^Y*(XY|Y)*X?$ # possible but not really efficient
^Y*(?>XY+)*X?$ # using an atomic group (if available)
^Y*(?:XY+)*+X?$ # using a possessive quantifier (if available)
^Y*(?=((XY+)*))\1X?$ # emulate `(?>(?:XY+)*)`
^Y*(?:(?=(XY+))\1)*X?$ # emulate `(?>XY+)*`