Есть ли способ создать регулярное выражение для захвата сбалансированных одиночных скобок, не захватывая двойные скобки, и наоборот? - PullRequest
1 голос
/ 02 июля 2019

У меня есть следующий тестовый образец [[test case]] with the [second [[test case2]]] and additional [[test [[cases]]]] and the [final test case] or [maybe [not]]. У меня также есть следующие регулярные выражения \[\[(?:[^\[\]]*|(?R))*\]\] и \[(?:[^\[\]]*|(?R))*\].

Первое совпадение с регулярным выражением:

  1. "[[test case]]", желательно
  2. "[[test case2]]", случай не имеет значения
  3. "[[test [[case]]]]", желательно

Второе совпадение с регулярным выражением:

  1. "[[test case]]", не желательно, так как это двойная скобка
  2. "[second [[test2]]]", желательно
  3. «[[test [[case]]]]», не желательно, так как это двойная скобка
  4. "[последний тестовый пример]", желательно
  5. "[возможно [не]]", желательно

У меня есть регулярное выражение, чтобы сбалансировать их, но я не могу понять, как сделать так, чтобы регулярное выражение с одной скобкой совпадало только с одной скобкой, но все же рекурсивно захватывать скобки.

Что мне нужно сделать, чтобы заставить работать второе регулярное выражение?

1 Ответ

0 голосов
/ 02 июля 2019

Ваши разработанные выражения в порядке, мы можем просто соединить их, используя чередование,

\[\[(?:[^\[\]]*|(?R))*\]\]|(\[(?:[^\[\]]*|(?R))*\])

, и оно будет возвращать как нужные, так и нежелательные совпадения в отдельных группах.

Демо

Тест

$re = '/(?:\[\[(?:[^\[\]]*|(?R))*\]\])|(\[(?:[^\[\]]*|(?R))*\])/m';
$str = '[[test case]] with the [second [[test case2]]] and additional [[test [[cases]]]] and the [final test case] or [maybe [not]] ';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...