繁体   English   中英

重叠匹配的正则表达式问题

[英]Issues with regex for overlapping matches

简而言之,我正在尝试匹配最符合此模式的字符串中最长的项目:

[0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]

例如,考虑字符串“abc 1.5 28.00”。 我想要匹配“5 28.00”。

使用“原样”模式,就像这样

preg_match_all('/[0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]/', 'abc 1.5 28.00', $result);

我们改为获得以下匹配:

[0] => 1.5 2
[1] => 8.00

由于显而易见的原因,没有“5 28.00”或“28.00”。

我做了一些研究,人们建议使用积极的前瞻来解决这类问题。 所以我尝试了以下内容

preg_match_all('/(?=([0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]))/', 'abc 1.5 28.00', $result);

给我们这些比赛:

[0] => 1.5 2
[1] => 5 28.00
[2] => 28.00
[3] => 8.00

现在,“5 28.00”在那里是好的,但它不能被可靠地识别为正确的匹配(例如,你不能只是从最后寻找最长的匹配,因为可能有更长的匹配,出现在字符串的早期)。 理想情况下,我希望最后的那些子匹配(索引2和3)不在那里,所以我们可以抓住最后一个索引。

有没有人有关于如何以最简单/最好的方式完成我所需要的想法? 让我知道我是否需要澄清任何事情,因为我知道这些东西会让人感到困惑,并且提前多多感谢。

**编辑:一些额外的输入/匹配示例

“abc 1.5 28.00999”=>“5 28.00”(即无法匹配字符串结尾,$)

“abc 500000.05.00”=>“5.00”

通过添加美元符号确保您在输入字符串的末尾匹配,可以轻松解决您的问题:

preg_match_all('/[0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]$/', 
               'abc 1.5 28.00', $result);

返回:

array (size=2)
  0 => 
    array (size=1)
      0 => string '5 28.00' (length=7)
  1 => 
    array (size=1)
      0 => string '.' (length=1)

现在我不完全确定你为什么把圆点包在括号中,但是就我所见,这个输出对你的问题是正确的,并且实现了“最远到右边”的要求。

我可以得到的最近的匹配如下

((?:\d\s*)+[.,](?:\s*\d){2})(?:(?![.,](?:\s*\d){2}).)*$

并产生以下输出(在每种情况下都看'1')......

'abc 1.5 28.00999' => array (
  0 => '5 28.00999',
  1 => '5 28.00',
)
'abc 500000.05.00' => array (
  0 => '05.00',
  1 => '05.00',
)
'abc 111.5 8.0c 6' => array (
  0 => '111.5 8.0c 6',
  1 => '111.5 8',
)
'abc 500000.05.0a0' => array (
  0 => '500000.05.0a0',
  1 => '500000.05',
)
'abc 1.5 28.00999 6  0 0.6 6' => array (
  0 => '00999 6  0 0.6 6',
  1 => '00999 6  0 0.6 6',
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM