Сопоставить IP-адрес с регулярным выражением в Erlang - PullRequest
4 голосов
/ 27 апреля 2011

Я изучаю модуль re в Erlang, и я просто хочу сопоставить IP-адрес в URL:

Url = "http://192.168.1.241/mod/fun?arg",
re:run(Url, "(\\d{1,3}\\.){3}\\d{1,3}", [{capture, all, list}]).

Но он вернул мне {match,["192.168.1.168","1."]}.Почему "1." в списке возврата?

Ответы [ 2 ]

5 голосов
/ 27 апреля 2011

Вы указали «all» для ValueSpec, что означает, что вы получите все соответствующие подгруппы. В данном случае это «1». Вместо «all» вы можете просто указать «first», и все, что вы получите, это первая подходящая группа (полный IP-адрес).

Вы должны сделать это так:

Url = "http://192.168.1.241/mod/fun?arg",
re:run(Url, "(\\d{1,3}\\.){3}\\d{1,3}", [{capture, first, list}]).

Это вернет:

{match,["192.168.1.241"]}

Подробнее здесь .

РЕДАКТИРОВАТЬ: На случай, если вы пропустите это, вот соответствующая часть в документах (которые объясняют это намного лучше, чем я: -)):

Указывает, какие захваченные (под) шаблоны должны быть возвращены. ValueSpec может быть либо атомом, описывающим предопределенный набор возвращаемых значений, либо списком, содержащим либо индексы, либо имена определенных подшаблонов для возврата.

Предопределенные наборы подшаблонов:

все

Все захваченные подшаблоны, включая полную совпадающую строку. Это значение по умолчанию.

первый

Только первый захваченный подшаблон, который всегда является полностью совпадающей частью предмета. Все явно захваченные подшаблоны отбрасываются.

all_but_first

Все, кроме первого соответствующего подшаблона, т. Е. Все явно захваченные подшаблоны, но не полная совпадающая часть строки темы. Это полезно, если регулярное выражение в целом соответствует большой части предмета, но интересующая вас часть находится в явно захваченном подшаблоне. Если тип возвращаемого значения - список или двоичный файл, хороший способ оптимизации - это не возвращать подшаблоны, которые вас не интересуют.

нет

Ни в коем случае не возвращать совпадающие подшаблоны, получая совпадение с одним атомом в качестве возвращаемого значения функции при успешном сопоставлении вместо возврата {match, list ()}. Указание пустого списка дает такое же поведение.

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

Попробуйте с:

((?:\\d{1,3}\\.){3}\\d{1,3})

Ваша текущая скобка соответствует только одной части IP-адреса.Если вы решите игнорировать его и соответствовать всему регулярному выражению, вы получите правильный результат.

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