регулярное выражение для соответствия вложенным скобкам - PullRequest
0 голосов
/ 06 мая 2010

Мне нужно регулярное выражение для правильного соответствия фигурных скобок, например, для каждого открытого и близкого abc{abc{bc}xyz} Мне нужно получить все это от {abc{bc}xyz} не получить {abc{bc}.

Я пытался использовать (\{.*?})

Ответы [ 6 ]

3 голосов
/ 06 мая 2010

Это невозможно с регулярными выражениями.Для этого необходима контекстно-свободная грамматика, а регулярные выражения работают только для конечных регулярных языков.

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

2 голосов
/ 06 мая 2010

Сбалансированные круглые скобки произвольной вложенной глубины не являются обычным языком. Это язык без контекста.

Тем не менее, многие реализации "регулярных выражений" на самом деле распознают больше, чем обычные языки, поэтому это возможно в некоторых реализациях, но не в других.

Википедии

2 голосов
/ 06 мая 2010

Это не задача для регулярного выражения. На этом этапе вам нужен парсер. Что означает грамматику языка, LL (1), LALR, рекурсивный спуск, книгу о драконах и вообще расщепляющуюся мигрень.

1 голос
/ 06 мая 2010

Как сказал Брайан, регулярные выражения могут быть не совсем подходящим инструментом, но если вы используете PHP, руководство дает пример того, как вы можете использовать регулярные выражения в рекурсивном / вложенная мода:

$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function parseTagsRecursive($input)
{

    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;

Я не уверен, будет ли это полезно для вас или нет.

0 голосов
/ 06 мая 2010

Предполагая, что вы хотите сделать, это выбрать максимальную подстроку между { и }:

.*? - это квантификатор lazy . То есть он будет соответствовать наименьшему возможному количеству символов. Если вы измените свое выражение на {.*}, вы должны найти, что оно будет работать.

Если вы хотите проверить, правильно ли сопоставлены фигурные скобки, то, как указали другие ответы, это невозможно с (одним) регулярным выражением. Вы можете сделать это, сканируя строку с помощью стека. Или с каким-то колдовством повторения вашего регулярного выражения по предыдущему максимальному соответствию. Хлоп.

0 голосов
/ 06 мая 2010

Это невозможно в «стандартном» языке регулярных выражений.Тем не менее, несколько разных реализаций имеют расширения, которые позволяют вам реализовать его.Например, вот сообщение в блоге, в котором объясняется, как это сделать с библиотекой регулярных выражений .NET .

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

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