如果第一个中有X则匹配,而第二个Y中的X可以是0

时间:2014-10-27 09:16:02

标签: regex

我目前正在制作一个计划。我需要一个带有Y和X的正则表达式,并且X对由Y分隔。它不必是相等的数字,但它不能包含彼此相对的多个X'。

示例:

# Don't match:
XXXYYYYY
#Match:
XYXYYYY
X

到目前为止我的尝试:

{Y*[X|^X]Y*[X|^X]Y*}*

问题是,如果第一个中有X而第二个中有X,则Y仍然可以为0.我可以直接测试双X吗?

4 个答案:

答案 0 :(得分:3)

由于上面的答案使用了前瞻,这个答案提供了一个vanilla正则表达式的解决方案:

^(X?Y)*X?$

上面的解决方案假设允许空字符串。否则:

^((X?Y)+X?|X)$

(随意使群体不被捕获)

感谢Unihedron简化XY|YX?Y


如果有人对此答案的有效性仍有疑问,solve the below equations

R1 = XR2 + YR3 + λ
R2 =       YR3 + λ
R3 = XR2 + YR3 + λ

DFA可以从上面的等式中得出。

如果不允许空字符串,请删除+ λ中的R1

答案 1 :(得分:2)

关于它的异常是什么?

^(?:X(?!X)|Y)+$

DEMO

说明:它只是一系列X和Y,其中X不能跟随另一个X(负向前瞻)。

答案 2 :(得分:0)

^(?!.*?XX)X[YX]*$

试试这个。这应该符合你的要求。参见演示。

http://regex101.com/r/sU3fA2/8

答案 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+)*`