【问题标题】:A regular expression to exclude a word/string排除单词/字符串的正则表达式
【发布时间】:2011-01-05 22:34:34
【问题描述】:

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

^/[a-z0-9]+$

这匹配诸如/hello/hello123 之类的字符串。

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

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

我最近一次微弱的尝试是

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

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

【问题讨论】:

标签: regex


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,这似乎成功了。我实际上需要这条规则来重写 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 我也有点不确定 (.+) 最后捕获原始请求中的查询字符串的性能。
  • 听起来这是另一个问题。您拥有的正则表达式看起来会捕获查询字符串 - 测试并查看您的查询字符串是否出现。另外 - (\?(.+))?$ 应该很快。我不会太担心速度。
  • 这对我不起作用,而 Alix Axel 的解决方案确实有效。我正在使用 Java 的 java.util.regex.Pattern 类。
  • 我确认 Mark 的 reMark ;) - 例如,Pycharm 是基于 Java 的,不是吗?因此,考虑到 Pycharm 搜索 Alix 的解决方案中的正则表达式有效,另一个则无效。
【解决方案2】:

应该这样做:

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

【讨论】:

  • 我认为后视需要一个固定宽度的模式?
  • @AlixAxel 确实如此,但更智能的正则表达式库将允许对备选方案进行不同长度的交替(并使用最长的),只要每个备选方案的长度都是固定的。
  • 这很聪明,但如果被忽略的单词在任何其他单词的末尾,我就会失败。即,如果您将“a”添加为被忽略的单词之一,那么任何以 a 结尾的单词都会被忽略
【解决方案3】:

因为你想排除这两个词,你需要一个连词:

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

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

【讨论】:

  • 这相当于上面较短的一个,它是一组替代方案的负前瞻。
  • @ChrisF 不,不是真的。 Seth 的解决方案与/ignoremenot 之类的内容不匹配,因为/ 后跟ignoreme
【解决方案4】:

这会从搜索结果中排除所有包含 ignoreme 的行。当连续有任何字符时,它也可以很好地工作

^((?!ignoreme).)*$

【讨论】:

    【解决方案5】:

    更简单:

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

    你会得到:

    ['hello']
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 2018-02-22
        相关资源
        最近更新 更多