Regex получает неправильный вывод в Java - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть строка, которая выглядит примерно так:

"'a' b '(dfg (1 2))' (3 4) (ad) d"

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

'a,' b, '(dfg (1 2)),' (3 4), (ad), d

Я сейчас использую:

"'\(.*\)|\(\.*\)|'\w+|\w+"

Но есть проблема, с которой я столкнулся, например, если я напишу

'(abc) (df)

будет возвращено

' (abc) (df)

вместо

'(abc), (df)

Итак, мой вопрос: есть ли способ решить эту проблему с помощью регулярного выражения или я должен решить это другим способом?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

Ответ - нет.

Язык, который вы пытаетесь проанализировать, не regular, это context-free.Таким образом, вы не можете разобрать его с помощью регулярных выражений.

Если вам интересно, вот грамматика:

 S->SS|e;
 S->'(A);
 A-> AA|(A)|w+;

Это не совсем так, поскольку вы не можете построить FSM для представленияэто верно, если вы можете рекурсивно включать скобочные структуры.

Ну, что угодно.Давайте ответим на вопрос «Как?».Пройдите строку от первого символа.Как только вы найдете дефис, начните считать скобки.Счет открытия для +1, счет закрытия для -1.Как только вы попали в закрывающую скобку с нулевым счетчиком, вставьте запятую после этой скобки.Проблема решена:

 'a 'b '(d f g (1 2)) '(3 4) (a d) d
        |      |   ||
        |      |   |+-- counter = 0 on closing bracket, insert comma
        |      |   +--- counter = 1
        |      +------- counter = 2
        +-------------- start counting, counter = 1

и т. Д.

0 голосов
/ 02 апреля 2012

Если я правильно понимаю, вы хотите добавить запятую перед каждым пробелом, кроме в скобках.Это правильно?

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

0 голосов
/ 02 апреля 2012

Если вы используете PCRE или подобное, вы можете использовать выражение вроде:

'?(?:\w+|(\(?:([^()]+|(?1))*\)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...