Разбор строк: как изолировать параметры, когда параметр может быть вложенной функцией - PullRequest
2 голосов
/ 07 апреля 2011

В Java я пытаюсь обработать функции из FUNC{parameter,parameter} с помощью регулярных выражений.Я выделил строку, содержащую параметры, и теперь мне нужно извлечь их из строки.Моя идея состояла в том, чтобы разделить параметры, используя метод string.split и символ ,.Т.е. expression.split(",").

Проблема в том, что сами параметры могут быть функциями, то есть что-то вроде

FUNC1{FUNC2{1,2},7}

Так что расщепление только по , не работает.Сейчас я пытаюсь выполнить следующее регулярное выражение:

[^\\{]+,[^\\}]+

Что, я думаю, означает разделить параметры на ,, которому предшествует что-то, что не является {, а затем что-тоэто не }.Но это тоже не работает ... в чем может быть проблема?

Ответы [ 4 ]

4 голосов
/ 07 апреля 2011

Регулярные выражения не могут анализировать бесконечно рекурсивные структуры, почему бы просто не прочитать строку и не проанализировать ваши параметры?

Считывать ввод по одному символу за раз, находить первую открывающую фигурную скобку, продолжатьчитать до тех пор, пока вы не нажмете запятую, которая не находится внутри другого набора фигурных скобок (считайте открывающую и закрывающую фигурные скобки, пока они не станут равными), и установите строку между этими позициями в значение первого параметра.Затем продолжайте читать ввод, пока не нажмете закрывающую фигурную скобку, которая не находится внутри другого набора фигурных скобок, и установите это значение для второго параметра.С помощью некоторого интеллектуального программирования (не совсем того алгоритма, который я описал) вы можете анализировать весь ввод за один проход, включая каждую функцию, указанную в аргументе, и аргументы этой функции.

1 голос
/ 07 апреля 2011

Я считаю, что лучший способ добиться этого - использовать Сканер . Сканер позволит вам пропускать определенные части ввода (в данном случае String), группировать (т.е. извлекать) некоторые его части путем сопоставления регулярных выражений и т. Д. Это очень полезный инструмент с мощным API.

Надеюсь, это поможет узнать, где искать.

1 голос
/ 07 апреля 2011
0 голосов
/ 07 апреля 2011

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

Что касается вашего текущего подхода, вызов String.split () будет поглощать / уничтожать часть строки, которая соответствует выражению (не только запятая!), И я не думаю, что это то, что вы хотите.

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