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

preg_match_all negative lookahead和negative lookback

  •  0
  • clarkk  · 技术社区  · 6 年前

    我有一个模式,从 (?<![\d.,]) 结束于 (?![\d.,%]| %)

    为什么匹配 16 ?

    我希望它和这根绳子里的任何东西都不匹配

    $pattern = '/(?<![\d.,])-?\d{1,3}(?:(?:[. ]\d{3})*|\d*)(?:\b|[^.,%]|[,]\d{1,2})-?(?![\d.,%]| %)/';
    $value = 'dag 08-16 flex pakke';
    
    echo "pattern: $pattern\nvalue: $value\n";
    
    preg_match_all($pattern, $value, $matches);
    print_r($matches);
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Wiktor Stribiżew    6 年前

    你的观察站在可选模式旁边, -? . 因此,每当查找失败时,就会发生回溯,并且会发生不受欢迎的匹配。

    要避免这种情况,请考虑可选模式 里面 环视模式。

    /-?(?<![\d.,]-|[\d.,])\d{1,3}(?:(?:[. ]\d{3})*|\d*)(?:\b|[^.,%]|,\d{1,2})(?!-?(?:[\d.,%]| %))-?/
       ^^^^^^^^^^^^^^^^^^^                                                   ^^^^^^^^^^^^^^^^^^^^^
    

    regex demo