Проблема с регулярным выражением PCRE - PullRequest
1 голос
/ 20 июля 2011

Я пытаюсь создать регулярное выражение, которое может соответствовать этому:

argument ::= define_scope [';' define_scope]*
define_scope ::= (['local'] | 'global') define_var
define_var ::= variable_name expression
variable_name ::= Name

Итак, что-то вроде local varName something;;world foo bar;;local foobar bar.
Я пробовал с:

((^|;;)?(local|world) (.+?) (.+?))+

но если я использую это в предыдущем примере, я получу эти совпадения:

local varName s
;;world foo b
;;local foobar b

, поэтому потребуется только первая буква последнего слова каждого совпадения.
Если я удаляю ленивое соответствие изпоследняя группа, она соответствует только:

local varName something;;world foo bar;;local foobar bar

, поэтому последняя группа something;;world foo bar;;local foobar bar.

Некоторые идеи, чтобы это исправить?

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

это не обычная грамматика, и результирующие предложения / слова (говорят на языке cs) не могут быть проанализированы с помощью регулярного выражения. это не зависящая от контекста грамматика, и вам нужен парсер, использующий рекурсивное спуск (LL-парсер).

1 голос
/ 11 августа 2011

Это регулярное выражение, в котором я нуждался:

((?:(local|world) )?(.*?)(?: (.+?))(?:(?<!;);(?!;)|$))+?

Этот может без проблем разобрать все, что имеет ;;без соответствия

В любом случае спасибо всем.

1 голос
/ 20 июля 2011

Регулярные выражения не являются основным конечным инструментом в вашем наборе инструментов, и их здесь будет недостаточно, но это можно сделать для работы с вашим конкретным ограниченным примером, указав, что оно соответствует (но нев том числе) точки с запятой и удаление нежадных ?:

/(^|;;)((local|world) (.+?) ([^;]+))/

Ваша проблема . соответствует любому символу.Совпадение . жадно пожирало остальную часть строки в первом матче, в то время как несжадно было удовлетворено первым персонажем.Решением было заставить его жадно сопоставлять все, кроме точек с запятой, с [^;]+.В идеале вы должны ограничить это списком символов, которые вы на самом деле ожидаете, вместо того, чтобы использовать . так свободно.

...