2017-08-25 762 views
1

我最近开始使用正则表达式,但我似乎无法弄清楚这个问题:正则表达式的多个条件

https://xxxx.yyyy.com/en 

对于这个网址我想创建一个正则表达式是唯一有效的,当下面的所有条件都为真:

  • 不包含 'XXXX'
  • 确实包含/ EN $或/ EN/

时I g ot验证2个独立的条件,但似乎无法把它们放在一起

\/en\/|\/en$|^(?!.*(xxxx)).*$ 

你能帮忙吗?

谢谢!

回答

1

您可以使用

/^(?!.*xxxx).*\/en(?:$|\/)/ 

regex demo

详细

  • ^ - 字符串的开始
  • (?!.*xxxx) - 不能有xxxx后的任何0+ chars其他tha N线断字符
  • .* - 比换行符字符以外的任何0或更多字符,尽可能多的
  • \/en - /en
  • (?:$|\/) - 端线或/

所以,如果你想与不止一个学期更换xxxx,使用

注意使y OU可能迫使发动机来匹配他们作为一个整体的话,如果你添加单词边界:

/^(?!.*\b(?:stage|acc)\b).*\/en(?:$|\/)/ 

如果你需要一个完整的字符串匹配,在模式的末尾添加.*

+1

谢谢!这解决了问题。 看起来我有更多的学习要做。 – Martijn

+0

@AhmadBamieh这里没有循环,只有1个向前看。 '(?:$ | \ /)'不等于'\ /?$',因为后者[在/ .../en/more中找不到'en /'](https://regex101.com/ r/ozgsCr/1) –

+0

@AhmadBamieh:我想你没有注意到我使用的lookahead是在字符串的开头*锚定*。该检查仅在字符串开始时进行一次**。你的*你需要继续进出前瞻性陈述是错误的。 –

0

只使用lookarounds:

^(?!.*xxxx)(?=.*\/en(?:$|\/)).*

^    // start of line 
(?!.*xxxx) // look ahead and don't match anything then 'xxxx' 
(?=   // look ahead and match 
.*\/en  // anything then '/en' 
(?:$|\/)  // end of line OR a slash 
)    // end of look ahead 
.*   // match all (can be omitted if testing lines) 
  • 标志:全球性的,多
  • 步骤:188
  • Demo
+0

这个正则表达式[不会在字符串末尾加上'en /'](https://regex101.com/r/3YZYYF/2)。此外,不需要第二个预测,你可以在最后加上'。* en \ /?$'而不是'。*',使其成为一种消费模式 - '^(?!。* xxxx。* )* EN \ /?$'。尽管如此,它不会做所有场景中OP的需求。 –

+0

谢谢。我改变它允许'en/foo'。我正在练习四处看看,测试我可以走多远。 – linden2015

+0

:)是的,现在它就像我的正则表达式一样,但是匹配'en /'后面的文本。基本上是一样的,但是由于消费部分被移动到第二个前瞻部分,所以复杂了1步。请注意,在你的模式中,'en'前面没有'/',因此可以在'mena /' –