【问题标题】:Process a regular expression with 2 exclusions处理具有 2 个排除项的正则表达式
【发布时间】:2012-06-22 08:37:54
【问题描述】:

我有一个正则表达式,它处理一个包含所有字母数字字符的 URL,包括 -_。我想添加一个异常,所以它不会处理 URL /basic/advance

/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([0-9_-]+)?

它应该处理上面的所有内容,除了“基本”和“高级”这两个词。

如何在上述正则表达式中添加异常。

我尝试在下面做一些事情,但没有奏效。

/?([a-zA-Z0-9_-]+^(?!basic) ^(?!advance))?/?([a-zA-Z0-9_-]+)?/?([0-9_-]+)?

有什么想法吗?

我使用以下链接作为指南。

String negation using regular expressions
Regular Expressions and negating a whole character group
What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

【问题讨论】:

  • 是否有理由需要在正则表达式中包含,而不是使用您的编程语言在使用正则表达式之前使用简单的文本比较来排除 URL?
  • 其实我在zend系统中使用这个。第一个正则表达式已经将 URL 路由到具有产品 ID 和子 ID 的单个控制器和模块。我需要添加一个例外,以便我可以将基本路由和前进到不同的控制器和模块。我可以通过编程来做到这一点。但我想以正确的方式做到这一点。

标签: regex regex-negation


【解决方案1】:

如果 'basic' 或 'advance' 只能位于序列的开头,则类似 /\/(?!basic\/)(?!advance\/)([a-zA-Z0-9_-]+)?\/([a-zA-Z0-9_-]+)?\/([0-9_-]+)?/ 的东西应该可以完成这项工作。 我认为您在负前瞻组件之前不需要 ^ 符号,中间也不需要空格。

这是一个测试它的脚本:

<?PHP
    $ptn = "/\/(?!basic\/)(?!advance\/)([a-zA-Z0-9_-]+)?\/([a-zA-Z0-9_-]+)?\/([0-9_-]+)?/";
    $str = '/basic/asdasd/123'; 
    preg_match($ptn, $str, $match1);
    print_r($match1);
    $str = '/bazic/asdasd/123';
    preg_match($ptn, $str, $match2);
    print_r($match2);
?>

【讨论】:

  • 好吧,我对 Zend 框架的工作原理不是很熟悉,但是下面的脚本确实区分了以 'basic' 或 'advance' 开头的内容以及所有其他匹配的字符串,即,我明白了,问题的重点。 &lt;?PHP $ptn = "/\/(?!basic\/)(?!advance\/)([a-zA-Z0-9_-]+)?\/([a-zA-Z0-9_-]+)?\/([0-9_-]+)?/"; $str = '/basic/asdasd/123'; preg_match($ptn, $str, $match1); print_r($match1); $str = '/bazic/asdasd/123'; preg_match($ptn, $str, $match2); print_r($match2); ?&gt;
  • (将脚本添加到答案本身以使其更具可读性)
【解决方案2】:

检查这个,但无论如何其他非字母数字字符也匹配!

/?([a-zA-Z0-9_-]+)?/?(?!.*(?:begin|advance))([a-zA-Z0-9_-]+)?/?([0-9_-]+)?

Debuggex Demo

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2017-03-13
    • 2012-12-05
    • 2019-10-28
    • 1970-01-01
    • 2015-02-09
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多