Регулярное выражение (группировка совпадений)
Как правильно группировать совпадения?
$text = "
{ bool0 ?
{ bool1 ? t : f } :
{ bool2 ? a : b } : nothing
}
";
preg_match_all($reg, $text, $match);
Хочу получить массив c совпадениями:
$match[1] bool0
$match[2] { bool1 ... } : { bool2 ... }
$match[3] nothing
Остановился на этом выражении, но оно не даёт нужного результата
"/{ (\w+) \?(?:[^{}]|(?:([^:](?0)|(.*})\s*:\s*)))*}/"
Нужно найти совпадения между первым знаком ? ($match[2]) и последним : $match[3]. Третья группа совпадений может отсутствовать, как и последнее двоеточие.
Если выражение находит фигурную скобку внутри, то скобка должна обязательно закрываться.
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Так как в каждой строке ожидается только одно совпадение, вам подойдёт следующее выражение:
(?s)^\s*{\s*(\w+)\s*\?\s*(.*?)(?:\s*:\s*({[^{}]*}|\S+))?\s*}\s*$
Подробности
(?s)- флаг, разрешающий точке находить также переносы строки^- начало текста\s*{\s*- символ{, слева и справа от которого может быть 0 и более пробельных символов(\w+)- Группа №1: одна и более букв, цифр или символов нижнего подчёркивания\s*\?\s*- символ?, слева и справа от которого может быть 0 и более пробельных символов(.*?)- Группа №2: ноль и более любых символов, как можно меньше(?:\s*:\s*({[^{}]*}|\S+))?- необязательная нехахватывающая группа, которая находит\s*:\s*- символ:, слева и справа от которого может быть 0 и более пробельных символов({[^{}]*}|\S+)- Группа №3:{, ноль и более символов, отличных от{и}, а потом}, или один и более символов, отличных от пробельных символов
\s*}\s*- символ}, слева и справа от которого может быть 0 и более пробельных символов$- конец текста.