[英]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.