4
假设以下字符串:正则表达式可选重复组
some text here [baz|foo] and here [foo|bar|baz] and even here [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"
}
]
}
]
结果是正确的,但该正则表达式仅限于在图案重复的块数。 是否有一些解决方法使其与sqare托架内的所有选项相匹配?
你可以用拉'preg_replace_callback'然后''爆炸[]'之间的所有值|'。 – chris85
使用PCRE样式引擎,您只会获得捕获组的固定匹配。如果您量化更大组中的捕获组,则捕获组如果可以再次匹配则会被覆盖。这在Dot-Net中不是问题。所以你可以按照chris85提到的方式来完成,或者你可以使用'\ G'构造来挑选括号内的单个值(每个匹配1个)。 – sln
@ chris85当然,可以这样做。但我想从正则表达式输出中获得所有的值。 –