Предположит следующую строку:регулярного выражения опциональна повторяющаяся группа
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"
}
]
}
]
Результат является правильным, но что регулярное выражение ограничивается количеством повторяющихся блоков в шаблоне. Есть ли способ обхода, чтобы он соответствовал всем параметрам в квадратных скобках?
Вы можете вывести все значения между '[]' 'с preg_replace_callback' затем взрываются на' | '. – chris85
Используя двигатели типа PCRE, вы получите только фиксированное совпадение групп захвата.Если вы количественно определяете группы захвата в более крупной группе, группы захвата перезаписываются, если они могут совпадать. Это не проблема в Dot-Net. Таким образом, вы можете сделать это так, как упоминает chris85, или вы можете использовать конструкцию '\ G' для выбора отдельных значений (1 за матч) внутри скобок. – sln
@ chris85 уверен, это можно сделать именно так. Но я хотел бы получить все значения только из результата регулярного выражения. –