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

Я пытаюсь понять регулярное выражение 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}

Вопрос: Как мне изменить свое регулярное выражение для достижения моей цели?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, если вы не уверены в открытии и закрытии фигурных скобок, если они встречаются в равном количестве, общее решение будет следующим:

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))*})

Живая демонстрация

Спасибо! Как мне настроить «Data \ s * = \ s * ({(?: [^ {}] * | (? 1)) *})», чтобы дополнительно сопоставить «var», который необязательно предшествует «Data»? «(var \ s +)? Data \ s * = \ s * ({(?: [^ {}] * | (? 1)) *}», похоже, ничего не делает

temuri 23.04.2018 02:48
(?1) во втором регулярном выражении вызывает первую группу захвата. Когда вы добавляете группу захвата в начале, вы меняете этот номер. Либо используйте не захватывающую группу (?:var\s+)?Data\s*=\s*({(?:[^{}]*|(?1))*}), либо замените (?1) на (?2): (var\s+)?Data\s*=\s*({(?:[^{}]*|(?2))*})
revo 23.04.2018 09:08

Другие вопросы по теме