代码之家  ›  专栏  ›  技术社区  ›  Shawn

正则表达式:如何排除多个字符组?

  •  10
  • Shawn  · 技术社区  · 16 年前

    我有一组网址:

    产品

    /类别

    顾客

    现在假设一个客户叫John,我想帮助John使用一个较短的URL访问自己的帐户页面:

    before : /customers/john
    after  : /john
    

    (假设客户名称是唯一的)

    我正在尝试找到一个合适的Regex调度器,这样所有客户都可以使用此功能:

    /marry
    /james
    /tony-the-red-beard
    

    以下是我现在(用php)得到的:

    '/^\/([^(products|categories|admin)].+)$/' => /customers/$1
    

    这似乎不起作用。有人能帮我吗?

    3 回复  |  直到 16 年前
        1
  •  18
  •   Brian Campbell Dennis Williamson    16 年前

    你需要的是一个消极的展望 assertion .您要说的是“我要匹配除这些特定字符串之外的任何字符串。”regex中的断言可以与字符串匹配,但它不使用任何字符,允许这些字符与regex的其余部分匹配。可以通过将模式包装在 (?! ) .

    '/^\/(?!products|categories|admin)(.+)$/'
    

    请注意,如果不允许客户名称包含斜线,则可能需要以下内容:

    '/^\/(?!products|categories|admin)([^/]+)$/'
    
        2
  •  8
  •   ephemient    16 年前

    这是解决问题的完全错误的方法,但是可以不使用否定lookaheads来表示固定的否定lookaheads。为清晰起见,增加间距:

    ^ (
    ( $ | [^/] |
      / ( $ | [^pc] |
        p ( $ | [^r] |
          r ( $ | [^o] |
            o ( $ | [^d] |
              d ( $ | [^u] |
                u ( $ | [^c] |
                  c ( $ | [^t] |
                    t ( $ | [^s] ))))))) |
        c ( $ | [^au] |
          a ( $ | [^t] |
            t ( $ | [^e] |
              e ( $ | [^g] |
                g ( $ | [^o] |
                  o ( $ | [^r] |
                    r ( $ | [^i] |
                      i ( $ | [^e] |
                        e ( $ | [^s] )))))))) |
          u ( $ | [^s] |
            s ( $ | [^t] |
              t ( $ | [^o] |
                o ( $ | [^m] |
                  m ( $ | [^e] |
                    e ( $ | [^r] |
                      r ( $ | [^s] ))))))))))
    ) .* ) $
    
        3
  •  0
  •   Rich Schuler    16 年前

    你试图用错误的方式使用否定的字符类。否定的字符类表示“与包含的字符不匹配”。你想说的是“如果我在这里指定的东西存在,就不要匹配”。要做到这一点,你必须有一点创造性。可能需要一些负面的观察。我对PHP的regex引擎不是百分之百的确定,但是类似的东西应该可以工作。

    /^\/(?<!(?:products|categories|admin))(.+)$/
    

    所以,负面的展望 (?<! ... ) 说不匹配 .+ 如果 products categories admin 先于它。那就是在一个非捕获组中 (?: ... ) .

    退房 Regular Expression Advanced Syntax Reference 需要额外的帮助。