在Erlang中将IP地址与regexp匹配

luj*_*ujb 4 regex erlang

我正在研究reErlang 的模块,我只想匹配URL中的IP地址:

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

但它又归还{match,["192.168.1.168","1."]}给我了.为什么"1."在退货清单中?

Joã*_*ves 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}]).
Run Code Online (Sandbox Code Playgroud)

这将返回:

{match,["192.168.1.241"]}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里.

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

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

预定义的子模式集是:

所有

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

第一

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

all_but_first

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

没有

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