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


298

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

^/[a-z0-9]+$

这匹配诸如/hello或的字符串/hello123

但是,我希望排除几个字符串值,例如/ignoreme/ignoreme2

我已经尝试了几种变体,但似乎无济于事!

我最近的微弱尝试是

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

任何帮助将不胜感激:-)


Answers:


376

这是另一种方式(使用否定的提前查询):

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

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


1
辉煌,似乎可以解决问题。我实际上需要此规则来进行url重写,并且我想忽略“ images”,“ css”和“ js”文件夹。所以我的规则如下:^ /(?! css | js | images)([az] +)/?(\?(。+))?$,它重写为/Profile.aspx?id=$1&$3此规则是否可以正常工作并传播查询字符串?因此,如果有人访问mydomain.com/hello?abc=123,我希望它重写为mydomain.com/Profile.aspx?id=hello&abc=123, 我也不确定(。+)的性能最后在原始请求中捕获查询字符串。
romiem 2010年

听起来这是另一个问题。您所看到的正则表达式将捕获查询字符串-测试并查看查询字符串是否附带。另外- (\?(.+))?$应该很快。我不会太担心速度。
赛斯

1
这对我不起作用,而Alix Axel的解决方案确实起作用。我正在使用Java的java.util.regex.Pattern类。
Mark Jeronimus

1
我确认Mark的reMark;)-例如,Pycharm是基于Java的,不是吗?因此,考虑到Pycharm搜索中的正则表达式,Alix的解决方案有效,而其他解决方案则无效。
范妮

43

应该这样做:

^/\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);

我认为向后看需要固定宽度的图案吗?
simon

2
@AlixAxel可以,但是更聪明的正则表达式库将允许替换的长度可变(并且使用最长的),只要每个替换的长度都固定。
克里斯(ChrisF)2014年

这很聪明,但是如果被忽略的单词在任何其他单词的末尾,对我来说都是失败的。例如,如果您将“ a”添加为忽略单词中的一个,则所有以a结尾的单词都将被忽略
singmotor

21

由于您想排除两个单词,因此需要一个变数:

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

现在,两个条件都必须为true(不允许ignoremeignoreme2)才能匹配。


1
这等效于上面的较短者,它是一组备选方案的负面预测。
克里斯(ChrisF)2014年

4
@ChrisF不,不是。赛斯(Seth)的解决方案与匹配/ignoremenot/其后跟ignoreme
Gumbo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.