我正在研究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."
在返回列表中?
答案 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地址的一部分匹配。如果你设置忽略它并匹配整个正则表达式,你将得到正确的结果。