Regex - замена текста, которого нет в кавычках - PullRequest
1 голос
/ 06 ноября 2010

Мне нужно «перевести» код паскаля (не весь код, просто строка a:=5 или Writeln("a=5?"). В паскале = означает «равно», но моя программа заменяет [^=!<>]=[^=!<>] на == , поэтому в writeln("a=5?") = также будет заменено на ==. Как избежать замены текста в кавычках? Я пробовал с ключевым словом AND: [^\"].*AND.*[^\"] до &&. Есть ли способ сделать это в одна замена для каждого ключевого слова?

Я пишу на Java.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2010

Вы не можете написать регулярное выражение для разбора Паскаля, даже это простое его подмножество.Если вы просто ищите предыдущую цитату, как вы предлагаете узнать, что это открытая цитата, а не закрытая цитата?Посмотрите на генератор синтаксического анализатора, например ANTLR или, в качестве альтернативы, более легкого веса, грамматику синтаксического анализа , например parboiled

0 голосов
/ 06 ноября 2010

Я полагаю, что вопрос: Как я могу использовать кровавый обратный вызов в регулярном выражении Java, чтобы я мог сопоставить в общей форме [^\"].*(x).*[^\"] и получить соответствующее значение замены?

И ответ - не очень легко, используя только стандартный API.(Эта очень полезная функция - , просто отсутствует .)

Однако можно выполнить регулярное выражение и затем использовать некрасивые манипуляции со строками для возвращаемых индексов из объекта Match.Метод-обертка для всего этого и включения многократно используемого интерфейса похож на 15 строк.

Фактический пример можно найти здесь: Java-эквивалент PHP preg_replace_callback

(И обратите внимание на то, что другие говорили о том, что Регулярные выражения не способны обрабатывать полную грамматику паскаля.)

0 голосов
/ 06 ноября 2010

Отрицательный lookbehind, вероятно, добьется цели.

Отрицательный lookbehind для кавычек будет что-то вроде этого: (? <= \ ") </p>

Вот дальнейшее чтение о том, как выглядит lookhehindработа: Взгляд за плечами

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