我正在学习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."
?
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()} 返回值。指定空列表会产生相同的行为。
请尝试以下方法:
((?:\\d{1,3}\\.){3}\\d{1,3})
您当前的括号只匹配了IP地址的一部分。如果您设置忽略它并匹配整个正则表达式,您将获得正确的结果。