0

我正在尝试编写一个正则表达式,它将匹配包含某个子字符串的字符串,但如果它还包含不同的子字符串则失败。我找到了这个答案,但我不确定如何让它满足我的需要。为了尽可能具体:

  • 是的,它必须将其作为表达式的一部分。我无权访问将处理此问题的代码。
  • 是的,它必须是一种表达方式。
  • 它需要使用 PHP 的正则表达式风格。我很确定它正在使用 preg 进行评估

为了了解我正在尝试做什么,我有一组我正在尝试过滤的 URL。我想匹配其中包含“/somedir”的 URL,但如果 URL 中也包含“somestring”,我不希望它匹配。

所以,

  • www.somesite.com/somedir/index.html
  • www.somesite.com/somedir/somotherdir/index.html
  • www.somesite.com/somedir/somepage.html

都会匹配,但是,

  • www.somesite.com/somedir/somestring.html
  • www.somesite.com/somedir/somestring/index.html

都会失败。

4

1 回答 1

0

您需要一个正则表达式,只有当它没有被另一个模式包围时才会接受某个模式:

~
    (?(DEFINE)
        (?<ACCEPT> must-contain-pattern)
        (?<REFUSE> must-not-contain-pattern)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux

DEFINE块中根据您的需要定义ACCEPT和模式,这应该可以工作。REFUSE

编辑:上面的模式通过定义两个命名的子模式为您的情况量身定制:

~
    (?(DEFINE)
        (?<ACCEPT> \Q/somedir\E)
        (?<REFUSE> \Qsomestring\E)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux
于 2013-03-07T18:01:08.587 回答