我正在研究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."在退货清单中?
您已为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()}返回时,产生单原子匹配作为函数的返回值.指定空列表会产生相同的行为.
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |