【发布时间】:2017-08-25 08:26:10
【问题描述】:
我最近开始使用正则表达式,但我似乎无法弄清楚这个问题:
https://xxxx.yyyy.com/en
对于这个 URL,我想创建一个仅在以下所有条件都为真时才有效的正则表达式:
- 不包含“xxxx”
- 确实包含 /en$ 或 /en/
我必须验证这 2 个单独的条件,但似乎无法将它们放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能帮忙吗?
谢谢!
【问题讨论】:
标签: regex
我最近开始使用正则表达式,但我似乎无法弄清楚这个问题:
https://xxxx.yyyy.com/en
对于这个 URL,我想创建一个仅在以下所有条件都为真时才有效的正则表达式:
我必须验证这 2 个单独的条件,但似乎无法将它们放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能帮忙吗?
谢谢!
【问题讨论】:
标签: regex
你可以使用
/^(?!.*xxxx).*\/en(?:$|\/)/
详情
^ - 字符串开头(?!.*xxxx) - 除了换行符之外的任何 0+ 字符后都不能有 xxxx
.* - 除换行符之外的任何 0 个或多个字符,尽可能多\/en - /en 子字符串(?:$|\/) - 字符串结尾或/
因此,如果您想用多个术语替换 xxxx,请使用
/^(?!.*(?:stage|acc)).*\/en(?:$|\/)/
请注意,如果您添加单词边界,您可能会强制引擎将它们作为整个单词进行匹配:
/^(?!.*\b(?:stage|acc)\b).*\/en(?:$|\/)/
如果您需要完整的字符串匹配,请在模式末尾添加.*。
【讨论】:
(?:$|\/)不等于\/?$,因为后者won't find en/ in .../en/more
仅使用环视:
^(?!.*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/ not at the end of the string。此外,不需要第二次前瞻,您可以将 .*en\/?$ 而不是 .* 放在最后,使其成为消费模式 - ^(?!.*xxxx.*).*en\/?$。尽管如此,它并不能满足所有场景中 OP 的需求。
en/foo。我正在练习环视,以测试我能走多远。
en/ 之后的文本。基本相同,但由于消耗部分被移动到第二个前瞻,所以复杂了 1 步。请注意,在您的模式中,en 前面没有 /,因此可以在 mena/ 中匹配