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

Php 关于重叠匹配的正则表达式问题,php,regex,preg-match-all,overlapping-matches,Php,Regex,Preg Match All,Overlapping Matches,简言之,我试图匹配符合此模式的字符串中最右边最长的项目: [0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9] 例如,考虑字符串“abc 1.5 28.00”。我想匹配“528.00” 使用“按原样”的模式,就像这样 我们得到了以下匹配项: [0] => 1.5 2 [1] => 8.00 由于明显的原因,没有“528.00”或“28.00” 我做了一些研究,人们建议对这样的问题使用积极的前瞻。所以我尝试了以下方法 preg_match_all('/(?=([0

简言之,我试图匹配符合此模式的字符串中最右边最长的项目:

[0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]
例如,考虑字符串“abc 1.5 28.00”。我想匹配“528.00”

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

我们得到了以下匹配项:

[0] => 1.5 2
[1] => 8.00
由于明显的原因,没有“528.00”或“28.00”

我做了一些研究,人们建议对这样的问题使用积极的前瞻。所以我尝试了以下方法

preg_match_all('/(?=([0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]))/', 'abc 1.5 28.00', $result);
((?:\d\s*)+[.,](?:\s*\d){2})(?:(?![.,](?:\s*\d){2}).)*$
给我们这些比赛:

[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)

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

我能为您找到的最接近的匹配是

preg_match_all('/(?=([0-9][0-9\s]*(\.|,)\s*[0-9]\s*[0-9]))/', 'abc 1.5 28.00', $result);
((?:\d\s*)+[.,](?:\s*\d){2})(?:(?![.,](?:\s*\d){2}).)*$
并生成以下输出(在每种情况下查看“1”)


提供更多输入字符串示例以及您想要捕获的内容。您可以将
(\.|,)
替换为
[,]
谢谢,这太愚蠢了。我想我还需要逃离这个世界。尽管如此?@G.Moore不,没有必要在
[]
块中避开
,我刚刚编辑了下面的答案,您能确认它满足您的需要吗?它当然符合你给出的模式。请参阅我的最新编辑。不幸的是,我们不能依赖所需的匹配作为字符串的结尾。不幸的是,您的编辑只会使标准不那么清晰。对于“abc 1.528.00999”=>“528.00”,我不知道它应该如何决定结果。你真的需要澄清所需的模式。什么是不清楚的?在最基本的层面上,我想要的是匹配我的原始帖子顶部的模式,并出现在搜索字符串的最右边。复杂的警告是,我想要最长的字符串,所以在我给出的示例中,[3]=>8.00是最右边的匹配,[1]=>5 28.00是最长和最右边的匹配。问题是,该示例匹配的字符串远远超出了您的解释范围。我可以继续大量生产与一个新示例相匹配的regexp,但您可能会找到另一个不起作用的示例。试着描述模式,而不是给出一组有限的例子。太接近了!除了这样一个例子:“abc 111.5 8.0c 6”之外,它似乎在所有方面都起到了作用。在这里,它应该匹配111.58,但不匹配任何内容。(如果删除错误的“c”,它将正确匹配58.06)。@G.Moore好的,现在如何?还有测试用例吗?我认为这很好!非常感谢你在这方面的帮助,非常感谢。如果我发现一个案子不管用,我会回来的,但应该是好的。