gpt4 book ai didi

php - 正则表达式可选重复组

转载 作者:可可西里 更新时间:2023-10-31 23:16:55 25 4
gpt4 key购买 nike

假设有以下字符串:

一些文本在这里 [baz|foo] 和这里 [foo|bar|baz] 甚至这里 [option]。

我只成功地匹配了这个丑陋的正则表达式(Regex101.com demo):

/(?:
\[
(?:
\|?
([^\|\[\]]+)
)?
(?:
\|?
([^\|\[\]]+)
)?
(?:
\|?
([^\|\[\]]+)
)?
\]
)/ugx

重点是我需要用方括号对匹配项进行分组。所以目前我确实有我需要的结果:

[
{
"match": 1,
"children": [
{
"group": 1,
"start": 16,
"end": 19,
"value": "baz"
},
{
"group": 2,
"start": 20,
"end": 23,
"value": "foo"
}
]
},
{
"match": 2,
"children": [
{
"group": 1,
"start": 35,
"end": 38,
"value": "foo"
},
{
"group": 2,
"start": 39,
"end": 42,
"value": "bar"
},
{
"group": 3,
"start": 43,
"end": 46,
"value": "baz"
}
]
},
{
"match": 3,
"children": [
{
"group": 1,
"start": 63,
"end": 69,
"value": "option"
}
]
}
]

结果是正确的,但正则表达式受限于模式中重复 block 的数量。是否有一些解决方法可以使其匹配方括号内的所有选项?

最佳答案

您将无法在模式中递归地生成捕获组,因为引擎没有为您提供这种能力。也就是说,您有两个选择:

  1. 根据 pipe 的出现次数构建正则表达式| 在您的输入字符串中。

通过这种方式,您可以构建一个具有最可能重复模式的 ([^][|]+) 的正则表达式,它将根据您的需要进行组匹配:

$pattern = (function () use ($string) {
$array = [];
for ($i = 0; $i <= substr_count($string, "|"); $i++) {
$array[] = $i == 0 ? '([^][|]+)' : '([^][|]+)?';
}
return implode("\|?", $array);
})();

通过提供如下输入字符串:

some text here [baz] and here [you|him|her|foo|bar|baz|foo|option|test] and even here [another].

熟正则表达式将是:

~\[([^][|]+)\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?\|?([^][|]+)?]~

Live demo

然后你就可以简单地使用它了:

preg_match_all("~\[$pattern]~", $string, $matches, PREG_SET_ORDER);

Live demo

这是一种变通方法,表明您可以节省时间并避免仅构建正则表达式的麻烦,而正则表达式并不总是一个简单方便的解决方案。

  1. 受益于其他语言功能。

上述解决方法并没有带来可靠的解决方案。它正在做很多不需要的工作。下面的代码确实适合这项工作:

// Capture strings between brackets
preg_match_all('~\[([^]]+)]~', $string, $matches);

$groups = [];

foreach ($matches[1] as $values) {
// Explode them on pipe
$groups[] = explode('|', $values);
}

输出将是:

Array
(
[0] => Array
(
[0] => baz
)

[1] => Array
(
[0] => you
[1] => him
[2] => her
[3] => foo
[4] => bar
[5] => baz
[6] => foo
[7] => option
[8] => test
)

[2] => Array
(
[0] => another
)

)

Live demo

关于php - 正则表达式可选重复组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39127335/

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