有关正则表达式的帮助包含和排除

时间:2011-03-15 15:21:23

标签: regex regex-negation

我想要一些正则表达式的帮助。

我正在尝试创建一个包含某些字符串并排除某些字符串的表达式。

例如:

我想要包含任何包含移动性http://www.something.com/mobility/

的网址

但我想排除包含商店http://www.something.com/store/mobility/

的任何网址

仅供参考我有很多关键字,我正在使用。目前我包括/mobility|enterprise|products/i,但我发现它无法排除包含其他关键字的链接。

提前感谢您提供的任何帮助和见解。

_t

3 个答案:

答案 0 :(得分:14)

要匹配必须包含一组单词的字符串,请使用正向前瞻:

^(?=.*(?:inc1|inc2|...))

要匹配具有停用词列表中的单词的字符串,您可以使用否定前瞻:

^(?!.*(?:ex1|ex2|...))

您可以将单个正则表达式中的上述两个要求组合为:

^(?=.*(?:inc1|inc2|...))(?!.*(?:ex1|ex2|...))REGEX_TO_MATCH_URL$

Rubular link

答案 1 :(得分:6)

可以在一个正则表达式中完成所有这些操作,但实际上并不需要。如果您运行两个单独的测试,我认为您将有更好的时间:一个用于包含规则,另一个用于排除规则。不确定您使用的是哪种语言,因此我将使用JavaScript作为示例:

function validate(str) {
    var required = /\b(mobility|enterprise|products)\b/i;
    var blocked = /\b(store|foo|bar)\b/i;

    return required.test(str) && !blocked.test(str);
}

如果你真的想以一种模式进行,尝试这样的事情:

/(?=.*\b(mobility|enterprise|products)\b)(?!.*\b(store|foo|bar)\b)(.+)/i

最后的i表示不区分大小写,因此如果您不使用JavaScript,请使用您的语言等效。

所有这一切,根据您对问题的描述,我认为您真正想要的是字符串操作。这是一个例子,再次使用JS:

function validate(str) {
    var required = ['mobility','enterprise','products'];
    var blocked = ['store','foo','bar'];
    var lowercaseStr = str.toLowerCase(); //or just use str if you want case sensitivity

    for (var i = 0; i < required.length; i++) {
        if (lowercaseStr.indexOf(required[i]) === -1) {
            return false;
        }
    }

    for (var j = 0; j < blocked.length; j++) {
        if (lowercaseStr.indexOf(blocked[j]) !== -1) {
            return false;
        }
    }
}

答案 2 :(得分:3)

将两个正则表达式设为好,一个为坏,并检查两者? (先坏,然后好)。你可以用一个正则表达式来做,但KISS总是一个很好的规则(http://en.wikipedia.org/wiki/KISS_principle

我要补充一点,你需要考虑“屁股”原则...... .*ass匹配ambassadorcassette,所以你可能想要一个分隔符({ {1}})每个单词之前和之后。 Obscenity Filters: Bad Idea, or Incredibly Intercoursing Bad Idea?