2010-01-09 2 views
1

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

Сообщение будет в формате «! COMMAND parameters»; единственная команда, которая построена системой до сих пор, повторяется.

Регулярное выражение, я использую выглядит следующим образом:

/![repeat] (.*?)/ 

Когда другие команды добавили это будет выглядеть так: Это не похоже

/![cmd1|cmd2|cmd3] (.*?)/ 

быть сопоставляя правильные вещи в строке , Может ли кто-нибудь предложить какие-либо данные по этому поводу?

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

() скобки возвращают данные, [] соответствует, но не возвращается.

Переключение на() также не работает.

Программа IRC, которую я пишу, имеет динамическое количество команд, до сих пор я только добавил «повторить», поэтому шаблон команды «[repeat]». Если бы я добавил «say», это будет «[repeat | say]».

ответ

4

Используйте круглые скобки для группировки:

/!(cmd1|cmd2|cmd3) (.*)/ 

Кронштейны […] обозначают класс символов, описывающий только один символ из набора символов.

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

1

Вы делаете одно не так. Если вы замените кронштейны [] на (), все должно работать. Между [] вы помещаете несколько букв в соответствие. [abc] будет соответствовать a, b или c, а не «abc», а (abc) будет соответствовать «abc», а (abc|bca) будет соответствовать «abc» или «bca».

Ознакомьтесь с регулярными выражениями Perl tutorial и reference для получения дополнительной информации.

1

Вы использовали плохие кронштейны

/!(cmd1|cmd2|cmd3) (.*)/ 

Я не понимаю, что вы имеете в виду с ? в своем регулярном выражении

+0

'' 'делает матч не жадным. – adamse

+0

Действительно благодарю вас за ваше объяснение. Я этого не знал. – Gaim

1

[repeat] класс характер и будет соответствовать г или е или р и т.д ..., Вы должны просто использовать

/!repeat (.*?)/ 

и

/!(cmd1|cmd2|cmd3) (.*?)/ 

Я не понимаю, именно то, что вы надеетесь, чтобы соответствовать, но ленивый оператор кажется неправильным, например

/!COMMAND (.*?)/ применительно к !COMMAND paramater будет матч !COMMAND only, (.*?) в конце регулярного выражения не будет соответствовать ничему.