在Erlang中使用正则表达式匹配IP地址

4

我正在学习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."

2个回答

5
您已经指定了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 可以是描述预定义返回值集的原子,也可以是包含要返回的特定子模式的索引或名称的列表。

子模式的预定义集是:

all

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

first

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

all_but_first

除第一个匹配子模式外的所有匹配子模式,即所有明确捕获的子模式,但不包括主体字符串的完全匹配部分。如果整个正则表达式与主体的大部分匹配,但您感兴趣的部分在明确捕获的子模式中,则此选项很有用。如果返回类型为列表或二进制,则不返回您不感兴趣的子模式是一种优化方式。

none

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


4

请尝试以下方法:

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

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


你的也可以。但是你表达式中的“?:”是什么意思? - lujb
它在结果集中忽略了分组。 - hsz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接