简而言之,我试图匹配符合此模式的字符串中最右边的最长项目:
[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"