在Erlang中将IP地址与regex匹配

时间:2011-04-27 08:05:43

标签: regex erlang

我正在研究Erlang的re模块,我只想匹配网址中的IP地址:

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 个答案:

答案 0 :(得分:5)

您已为ValueSpec指定了“all”,这意味着您将获得所有匹配的子组。在这种情况下,包括“1.”。您可以只指定“第一个”而不是“全部”,而您将获得的是第一个匹配组(完整的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"]}

更多信息here

编辑:万一你错过了,这里是文档中的相关部分(比我解释的要好得多: - )):

  

指定要返回的捕获(子)模式。 ValueSpec可以是描述预定义返回值集的原子,也可以是包含要返回的特定子模式的索引或名称的列表。

     

预定义的子模式集是:

     

所有

     

所有捕获的子模式,包括完整匹配的字符串。这是默认值。

     

<强>第一

     

只有第一个捕获的子模式,它始终是主题的完全匹配部分。所有明确捕获的子模式都将被丢弃。

     

<强> all_but_first

     

除了第一个匹配的子模式之外的所有子模式,即所有显式捕获的子模式,但不是主题字符串的完整匹配部分。如果正则表达式作为一个整体与主题的大部分匹配,则这很有用,但您感兴趣的部分位于显式捕获的子模式中。如果返回类型是列表或二进制,则不返回您不感兴趣的子模式是一种优化的好方法。

     

<强>无

     

根本不返回匹配的子模式,当成功匹配而不是{match,list()}返回时,产生单个原子匹配作为函数的返回值。指定一个空列表会产生相同的行为。

答案 1 :(得分:4)

尝试:

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

您当前的括号仅与IP地址的一部分匹配。如果你设置忽略它并匹配整个正则表达式,你将得到正确的结果。