【问题标题】:Regex multiple conditions正则表达式多个条件
【发布时间】:2017-08-25 08:26:10
【问题描述】:

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

https://xxxx.yyyy.com/en

对于这个 URL,我想创建一个仅在以下所有条件都为真时才有效的正则表达式:

  • 不包含“xxxx”
  • 确实包含 /en$ 或 /en/

我必须验证这 2 个单独的条件,但似乎无法将它们放在一起

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

你能帮忙吗?

谢谢!

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以使用

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

    regex demo

    详情

    • ^ - 字符串开头
    • (?!.*xxxx) - 除了换行符之外的任何 0+ 字符后都不能有 xxxx
    • .* - 除换行符之外的任何 0 个或多个字符,尽可能多
    • \/en - /en 子字符串
    • (?:$|\/) - 字符串结尾或/

    因此,如果您想用多个术语替换 xxxx,请使用

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

    请注意,如果您添加单词边界,您可能会强制引擎将它们作为整个单词进行匹配:

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

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

    【讨论】:

    • 谢谢!这解决了问题。看来我还有一点学习要做。
    • @AhmadBamieh 这里没有循环,只有 1 个前瞻。 (?:$|\/)不等于\/?$,因为后者won't find en/ in .../en/more
    • @AhmadBamieh:我想你没有注意到我使用的前瞻是 anchored 在字符串的开头。检查仅在字符串的开头进行一次。您的您需要不断进出前瞻语句是错误的。
    【解决方案2】:

    仅使用环视:

    ^(?!.*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

    【讨论】:

    • 这个正则表达式will not match en/ not at the end of the string。此外,不需要第二次前瞻,您可以将 .*en\/?$ 而不是 .* 放在最后,使其成为消费模式 - ^(?!.*xxxx.*).*en\/?$。尽管如此,它并不能满足所有场景中 OP 的需求。
    • 谢谢。我将其更改为允许en/foo。我正在练习环视,以测试我能走多远。
    • :) 是的,现在它就像我的正则表达式一样,但匹配前瞻中en/ 之后的文本。基本相同,但由于消耗部分被移动到第二个前瞻,所以复杂了 1 步。请注意,在您的模式中,en 前面没有 /,因此可以在 mena/ 中匹配
    • 好收获。已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2016-08-23
    相关资源
    最近更新 更多