在Erlang中将IP地址与regexp匹配

在Erlang中将IP地址与regexp匹配,regex,erlang,Regex,Erlang,我正在研究Erlang的re模块,我只想在URL中匹配一个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.”在退货列表中?试试: ((?:\\d{1,3}\\.){3}\\d{1,3}) 当前括号仅与IP地址的一部分匹配。如果设置

我正在研究Erlang的
re
模块,我只想在URL中匹配一个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.”
在退货列表中?

试试:

((?:\\d{1,3}\\.){3}\\d{1,3})
当前括号仅与IP地址的一部分匹配。如果设置为忽略它并匹配整个regexp,您将得到正确的结果。

您已为ValueSpec指定了“all”,这意味着您将获得所有匹配的子组。在这种情况下,包括“1”。您可以只指定“first”而不是“all”,您将得到的只是第一个匹配组(完整的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可以是描述预定义返回值集的原子,也可以是包含要返回的特定子模式的索引或名称的列表

预定义的子模式集包括:

全部

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

首先

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

除了第一个以外的所有项目

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

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


你的也行。但“?:”在您的表达式中的含义是什么?它忽略结果集中的组。