2012-06-11 2 views
1

имеют такую ​​проблему с regexp в java. Я использую приложение для чата и клиент может отправить на сервер только «сообщение» или «значение команды». Я хочу проанализировать эту строку и проверить, была ли она командой или нет. Если это логин - значение требуется, но если значение logout.required должно быть ложным. Я создаю такое regexpРегулярные выражения, выпуски групп

"^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)" 

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

ответ

1

я бы, вероятно, сделать проверку на том, следует ли определенная команда имеет параметр или нет в коде общего назначения (т.е. Java), а не в регулярном выражении. То есть регулярные выражения хороши для токенизации, но не для синтаксического анализа.

Однако, если у вас есть все основания для этого, то я бы, вероятно, разделил это выражение на две части - одну, где командам требуется команда, а другая - там, где они нет. Например:

^\\(?:(?<command>login)\s+(?<param>\w+)|(?<command>status|logout)(?<param>))$ 

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

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

Это может более четко написано, как так, если вы используете Groovy (или Java 7) для строк многострочных:

^\\(?x: 
    (?<command>login) \s+ (?<param>\w+) # Commands that require a parameter 
    |          # -or- 
    (?<command>status|logout) (?<param>) # Commands that do not require a parameter 
)$ 
+0

Nope Pattern не позволяет мне объявлять имя группы дважды. Должен ли я делать 2 шаблона? –

+0

Ahhh, извините, Игорь. Если несколько именованных групп, подобных этому, не работают на Java, я бы предложил пойти с решением @ Qtax. Регулярные выражения имеют смысл, когда они просты, но как только вы должны начать внедрять в них логику, вам лучше перейти на язык более высокого уровня. –

+0

=) Ok thx! Я вношу некоторые изменения в свою логику чата ... –

2

Вы, вероятно, лучше сделать параметр опциональный:

^\\(?<command>login|status|logout)(?:\s(?<param>\w+))? 

и проверка логики результатов с Java.

Если вы действительно хотите йо использовать регулярное выражение, вы можете сделать:

^\\(?<command>login|status|logout(?=$))(?:\s(?<param>\w+))?$ 
+0

Да, конечно, я могу это сделать с помощью Java. Но весь день я ищу возможность сделать это с помощью регулярного выражения. =) И почему вы удаляете косая черта? Шаблон не понимает \ s? И он не понимает $. Это не соответствует ему. –

+0

@Igor, я пишу строку регулярных выражений (как она будет выглядеть, если вы ее распечатаете), дополнительные косые обратные косы нужны только при цитировании. – Qtax

+0

Может быть, потому что я использую readline? или обрезать строку, и обрезать "\ n"? –

Смежные вопросы