Я пытаюсь понять регулярное выражение PHP.
Данная многострочная строка:
var Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}}]}'
}
var Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}}]}'
};
// Some other text here that may have }; or }. Blahblah blah.
// };
// }
Мне нужны следующие два совпадения из приведенной выше строки:
Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}}]}'
}
Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}}]}'
}
Я пробовал Data\s?=\s?{[^}]+};?, но он соответствует:
Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}
Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}
Вопрос: Как мне изменить свое регулярное выражение для достижения моей цели?






Во-первых, если вы не уверены в открытии и закрытии фигурных скобок, если они встречаются в равном количестве, общее решение будет следующим:
Data\s*=\s{(?:[^:}]*:.*\R+)+}
Авария:
Data\s*=\s{ Соответствует Data = { с дополнительными пробелами между(?: Начало группы без захвата
[^:}]*:.*\R+ Соответствует строке со следующим символом новой строки)+ Повторите как можно больше} Соответствующая конечная скобкаКод PHP (Демо):
preg_match_all('~Data\s*=\s{(?:[^:}]*:.*\R+)+}~', $str, $matches);
print_r($matches[0]);
Но в остальном, чтобы сослаться только на мой комментарий, вам нужны вызовы подпрограмм и рекурсии, которые поддерживаются обеими PCRE:
Data\s*=\s*({(?:[^{}]*|(?1))*})
(?1) во втором регулярном выражении вызывает первую группу захвата. Когда вы добавляете группу захвата в начале, вы меняете этот номер. Либо используйте не захватывающую группу (?:var\s+)?Data\s*=\s*({(?:[^{}]*|(?1))*}), либо замените (?1) на (?2): (var\s+)?Data\s*=\s*({(?:[^{}]*|(?2))*})
Спасибо! Как мне настроить «Data \ s * = \ s * ({(?: [^ {}] * | (? 1)) *})», чтобы дополнительно сопоставить «var», который необязательно предшествует «Data»? «(var \ s +)? Data \ s * = \ s * ({(?: [^ {}] * | (? 1)) *}», похоже, ничего не делает