gpt4 book ai didi

php - 正则表达式挑战 : Capture all the numbers in a specific row

转载 作者:可可西里 更新时间:2023-11-01 13:22:26 26 4
gpt4 key购买 nike

假设我们有这样的文本:

...
settingsA=9, 4.2
settingsB=3, 1.5, 9, 2, 4, 6
settingsC=8, 3, 2.5, 1
...

问题是我如何使用一个步骤捕获特定行中的所有数字?

单步意味着:

  • 单个正则表达式模式。
  • 单一操作(无循环或拆分等)
  • 所有匹配都被捕获在一个数组中。

假设我想捕获以 settingsB= 开头的行中出现的所有数字。最终结果应该是这样的:

3
1.5
9
2
4
6

我失败的尝试:

<?php
$subject =
"settingsA=9, 4.2
settingsB=3, 1.5, 9, 2, 4, 6
settingsC=8, 3, 2.5, 1";

$pattern = '([\d\.]+)(, )?' // FAILED!
$pattern = '(?:settingsB=)(?:([\d\.]+)(?:, )?)' // FAILED!
$pattern = '(?:settingsB=)(?:([\d\.]+)(?:, )?)+' // FAILED!
$pattern = '(?<=^settingsB=|, )([\d+\.]+)' // FAILED!

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
if ($matches) {
print_r($matches);
}
?>

更新 1:不幸的是,@Saleem 的示例使用了多个步骤而不是单个步骤。我并不是说他的例子不好(它确实有效),但我想知道是否有另一种方法可以做到这一点以及如何做到这一点。有什么想法吗?

更新 2:@bobble bubble 为这一挑战提供了完美的解决方案。

最佳答案

您可以使用 \G anchor将匹配项粘贴到上一个匹配项的末尾。此模式也使用 \K to reset在所需部分与 PCRE 正则表达式风格一起工作之前。

(?:settingsB *=|\G(?!^) *,) *\K[\d.]+
  • (?: 打开一个 non-capturing group 进行交替
  • 匹配 settingsB,后跟 * 任意大小的空格,后跟文字 =
  • |\G(?!^) 或从上一场比赛结束但未开始的地方继续
  • *, 并匹配前面有可选空格的逗号
  • ) 交替结束(非捕获组)
  • *\K 可选空格后重置
  • [\d.]+ 匹配一个或多个数字和句点。

如果序列包含制表符或换行符,请使用 \s用于空白字符而不是空格。

See demo at regex101PHP demo at eval.in

or this more compatible pattern使用 capturing group而不是 \K ,它应该在任何支持 \G anchor (Java、.NET、Ruby ...)的正则表达式风格中工作

关于php - 正则表达式挑战 : Capture all the numbers in a specific row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com