我最近开始使用正则表达式,但我似乎无法弄清楚这个问题:正则表达式的多个条件
https://xxxx.yyyy.com/en
对于这个网址我想创建一个正则表达式是唯一有效的,当下面的所有条件都为真:
- 不包含 'XXXX'
- 确实包含/ EN $或/ EN/
时I g ot验证2个独立的条件,但似乎无法把它们放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能帮忙吗?
谢谢!
我最近开始使用正则表达式,但我似乎无法弄清楚这个问题:正则表达式的多个条件
https://xxxx.yyyy.com/en
对于这个网址我想创建一个正则表达式是唯一有效的,当下面的所有条件都为真:
时I g ot验证2个独立的条件,但似乎无法把它们放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能帮忙吗?
谢谢!
您可以使用
/^(?!.*xxxx).*\/en(?:$|\/)/
详细
^
- 字符串的开始(?!.*xxxx)
- 不能有xxxx
后的任何0+ chars其他tha N线断字符.*
- 比换行符字符以外的任何0或更多字符,尽可能多的\/en
- /en
子(?:$|\/)
- 端线或/
所以,如果你想与不止一个学期更换xxxx
,使用
注意使y OU可能迫使发动机来匹配他们作为一个整体的话,如果你添加单词边界:
/^(?!.*\b(?:stage|acc)\b).*\/en(?:$|\/)/
如果你需要一个完整的字符串匹配,在模式的末尾添加.*
。
只使用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)
这个正则表达式[不会在字符串末尾加上'en /'](https://regex101.com/r/3YZYYF/2)。此外,不需要第二个预测,你可以在最后加上'。* en \ /?$'而不是'。*',使其成为一种消费模式 - '^(?!。* xxxx。* )* EN \ /?$'。尽管如此,它不会做所有场景中OP的需求。 –
谢谢。我改变它允许'en/foo'。我正在练习四处看看,测试我可以走多远。 – linden2015
:)是的,现在它就像我的正则表达式一样,但是匹配'en /'后面的文本。基本上是一样的,但是由于消费部分被移动到第二个前瞻部分,所以复杂了1步。请注意,在你的模式中,'en'前面没有'/',因此可以在'mena /' –
谢谢!这解决了问题。 看起来我有更多的学习要做。 – Martijn
@AhmadBamieh这里没有循环,只有1个向前看。 '(?:$ | \ /)'不等于'\ /?$',因为后者[在/ .../en/more中找不到'en /'](https://regex101.com/ r/ozgsCr/1) –
@AhmadBamieh:我想你没有注意到我使用的lookahead是在字符串的开头*锚定*。该检查仅在字符串开始时进行一次**。你的*你需要继续进出前瞻性陈述是错误的。 –