Сопоставить канал IRC с регулярным выражением (RFC 2811-2813) - PullRequest
2 голосов
/ 24 февраля 2012

Я знаю, что на этот вопрос дан ответ в соответствии с RFC 1459 . Но как можно использовать регулярные выражения для сопоставления каналов в соответствии с RFC 2811-2813?

RFC 2811 заявляет:

Имена каналов - это строки (начинающиеся с '&', '#', '+' или '!' символ) длиной до пятидесяти (50) символов. Названия каналов регистр не учитывается.

Помимо требования, что первый символ либо '&', '#', '+' или '!' (далее называемый «префикс канала»). Единственный ограничение на имя канала в том, что оно НЕ ДОЛЖНО содержать пробелов (''), элемент управления G (^ G или ASCII 7), запятая (',', которая используется как разделитель элементов списка по протоколу). Кроме того, двоеточие (':') используется как разделитель для маски канала. Точный синтаксис названия канала определяется в «Протокол сервера IRC» [IRC-SERVER].

И в дополнение к этому RFC 2812 заявляет:

channel    =  ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring
              [ ":" chanstring ]
chanstring =  %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B
chanstring =/ %x2D-39 / %x3B-FF
                ; any octet except NUL, BELL, CR, LF, " ", "," and ":"
channelid  = 5( %x41-5A / digit )   ; 5( A-Z / 0-9 )

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

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

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

[#&][a-z]{1,20}

То есть # или &, за которыми следуют от 1 до 20 букв. Поскольку channelid не следует той же схеме, регулярное выражение для этого может быть:

![A-Z0-9]{5}

, то есть !, за которым следуют ровно 5 заглавных букв или цифр. Для полного регулярного выражения, соответствующего любому из них, вы комбинируете их с (...|...), например:

([#&][a-z]{1,20}|![A-Z0-9]{5})

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

0 голосов
/ 18 мая 2014

Как определено RFC2812 (если я не ошибаюсь), за исключением того, что он не обрабатывает максимальную длину (50 байтов), это регулярное выражение Python, оно быстро сделано, но должно работать правильно ...:

^(((![A-Z0-9]{5})|([#+&][^\x00\x07\r\n ,:]+))(:[^\x00\x07\r\n ,:]+)?)$

вы можете визуализировать логику регулярного выражения здесь

НТН ..

...