Tom*_*Tom 11 regex regex-negation
我想要一些正则表达式的帮助.
我正在尝试创建一个包含某些字符串并排除某些字符串的表达式.
例如:
我想包含任何包含移动性的网址 http://www.something.com/mobility/
但是,我想排除任何包含商店的URL http://www.something.com/store/mobility/
仅供参考我有很多关键字,我正在使用.目前我包括这样/mobility|enterprise|products/i
但是我发现它不能排除包含其他关键字的链接.
提前感谢您提供的任何帮助和见解.
_t
cod*_*ict 15
要匹配必须包含一组单词中的单词的字符串,您可以使用正向前瞻:
^(?=.*(?:inc1|inc2|...))
Run Code Online (Sandbox Code Playgroud)
要匹配具有停用词列表中的单词的字符串,您可以使用否定前瞻:
^(?!.*(?:ex1|ex2|...))
Run Code Online (Sandbox Code Playgroud)
您可以将单个正则表达式中的上述两个要求组合为:
^(?=.*(?:inc1|inc2|...))(?!.*(?:ex1|ex2|...))REGEX_TO_MATCH_URL$
Run Code Online (Sandbox Code Playgroud)
可以在一个正则表达式中完成所有这些操作,但实际上并不需要.如果您运行两个单独的测试,我认为您将有更好的时间:一个用于包含规则,另一个用于排除规则.不确定您使用的是哪种语言,因此我将使用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);
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想在一个模式中做到这一点,尝试这样的事情:
/(?=.*\b(mobility|enterprise|products)\b)(?!.*\b(store|foo|bar)\b)(.+)/i
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)