使用2个排除处理正则表达式

时间:2012-06-20 08:32:41

标签: regex regex-negation

我有一个正则表达式,用于处理包含-_的所有字母数字字符的网址。我想添加一个例外,因此它不会处理网址/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?

2 个答案:

答案 0 :(得分:0)

/\/(?!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);
?>

答案 1 :(得分:0)

检查一下,但无论如何其他不是字母数字字符也匹配!

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

Debuggex Demo