PHP不尊重非捕获组,具有内部捕获组的前瞻

时间:2015-06-02 23:31:47

标签: php regex

我有这个PHP正则表达式匹配:

 preg_match_all('/(\d+)(?:\.(?=(\d+)))?/', "43.3", $matches, PREG_SET_ORDER);

(至少在mi mind中)意味着:

Match one or more numbers as a group, and if there is a '.' after that
group followed by a group of numbers, match those too, but ignore the '.'.

所以,可能的字符串是:

1
23244
24.5
2.454646

但不是:

1.

现在,这在regex101.com中完全适用于我抛出的任何测试字符串,但它似乎并没有使用PHP。如果我var_dump($matches)

,这就是我得到的
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "43."
    [1]=>
    string(2) "43"
    [2]=>
    string(1) "3"
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) "3"
    [1]=>
    string(1) "3"
  }
}
  • 为什么我在43
  • 之后得到了这一点
  • 为什么我要复制一切?
  • 为什么我在第一组中获得3

2 个答案:

答案 0 :(得分:1)

第一场比赛总是完全匹配,好像你的整个模式被包裹在一组括号中。我认为你不能把它关掉。

您在第一组中获得(\d+),因为您的模式中有两个?=。如果您不想要,请从>>> preg_match_all('/(?<!\d)\d+(?:\.\d+)?(?![\d.])/', "43.3 31.52 1.", $matches); => 2 >>> $matches => [ [ "43.3", "31.52" ] ] 之后的括号中删除括号。

如果您只想要完整的数字,可以尝试这样的事情:

preg_match

如果只有一个号码,则应使用preg_match_all,而不是>>> preg_match_all('/(\d+)(?:\.(\d+))?/', "43.3", $matches) => 1 >>> $matches => [ [ "43.3" ], [ "43" ], [ "3" ] ] 。 e.g。

array_shift

您可以随时 <script> var div = document.getElementById('dropzone') </script> 完全匹配。

答案 1 :(得分:1)

两个子数组的Column1 Column2 Very long text 'UY58IOP' UY58IOP Very long text 'UY58IOP' LDK09JY Very long text 'LDK09JY' TE89UTY Very long text 'TE89UTY' Very long text 'OO48TSI' 部分中的值是在每种情况下匹配的整个字符串,然后[0][1]用于捕获组。

总体上有两场比赛,第一场比赛的整个文字是[2]这是因为你的正则表达式在说:

  • 匹配某些数字43.
  • 可选择匹配一个必须后跟一些数字(\d+)
  • 的点

字符串的(?:\.(?=(\d+)))?部分满足要求,因为在点之后是字符串末尾的43.

问题并不完全清楚,但听起来你根本不想使用前瞻3

例如,(?=…)将提供以下内容:

/(\d+)(?:\.(\d+))?/