用于排除单词/字符串的正则表达式

时间:2010-01-16 21:07:45

标签: regex

我有一个正则表达式如下:

^/[a-z0-9]+$

这会匹配/hello/hello123等字符串。

但是,我希望它排除一些字符串值,例如/ignoreme/ignoreme2

我尝试了一些变种,但似乎无法正常工作!

我最近的微弱尝试是

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

感谢任何帮助: - )

6 个答案:

答案 0 :(得分:294)

这是另一种方式:(使用negative look-ahead):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

注意:只有一个捕获表达式:([a-z0-9]+)

答案 1 :(得分:35)

这应该这样做:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

您可以根据需要添加尽可能多的忽略词,这是一个简单的PHP实现:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

答案 2 :(得分:14)

如果你想排除这两个词,你需要一个结合:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

现在两个条件必须为真( ignoreme ignoreme2 都不允许)才能匹配。

答案 3 :(得分:0)

更简单:

re.findall(r'/(?!ignoreme)(\w+)',  "/hello /ignoreme and /ignoreme2 /ignoreme2M.")

您将得到:

['hello']

答案 4 :(得分:0)

这会从搜索结果中排除所有包含 ignore 的行。当一行中有任何字符时,它也能很好地工作

^((?!ignoreme).)*$

答案 5 :(得分:0)

这对我有用: ^((?!\ignoreme1\b)(?!\ignoreme2\b)(?!\ignoreme3\b).)*$