将正则表达式转换为erlang的语法?

时间:2016-05-26 03:03:27

标签: regex erlang

我很难尝试将以下正则表达式转换为erlang语法。

我所拥有的是这样的测试字符串:

1,2 ==> 3 #SUP: 1 #CONF: 1.0

我使用regex101创建的正则表达式是这样的(见下文):

([\d,]+).*==>\s*(\d+)\s*#SUP:\s*(\d)\s*#CONF:\s*(\d+.\d+)

Regex

但如果我将它转换为erlang,我会得到奇怪的匹配结果 - 这是我的尝试:

{ok, M} = re:compile("([\\d,]+).*==>\\s*(\\d+)\\s*#SUP:\\s*(\\d)\\s*#CONF:\\s*(\\d+.\\d+)").
re:run("1,2 ==> 3 #SUP: 1 #CONF: 1.0", M).

另外,我得到超过四场比赛。我做错了什么?

这是regex101版本: https://regex101.com/r/xJ9fP2/1

2 个答案:

答案 0 :(得分:5)

我对erlang了解不多,但我会尽力解释。你的正则表达式

>{ok, M} = re:compile("([\\d,]+).*==>\\s*(\\d+)\\s*#SUP:\\s*(\\d)\\s*#CONF:\\s*(\\d+.\\d+)").
>re:run("1,2 ==> 3 #SUP: 1 #CONF: 1.0", M).                                                  
{match,[{0, 28},{0,3},{8,1},{16,1},{25,3}]}
         ^^ ^^
         || ||
         || Total number of matched characters from starting index
   Starting index of match

超过四组的原因

首次匹配 始终 表示与 完整 正则表达式匹配的整个字符串,其余部分为你想要的四个被捕集的团体总共有5组。

([\\d,]+).*==>\\s*(\\d+)\\s*#SUP:\\s*(\\d)\\s*#CONF:\\s*(\\d+.\\d+)
<------->         <---->             <--->              <--------->
First group    Second group       Third group           Fourth group
<----------------------------------------------------------------->
This regex matches entire string and is first match you are getting
                      (Zero'th group)

如何找到所需答案

这里我们需要除第一组以外的任何内容(是regex 完全匹配)。因此,我们可以使用all_but_first来避免第一组

> re:run("1,2 ==> 3 #SUP: 1 #CONF: 1.0", M, [{capture, all_but_first, list}]).                
{match,["1,2","3","1","1.0"]}

可以找到更多信息 here

答案 1 :(得分:0)

如果您对字符串的内容有疑问,可以打印并查看:

1> RE = "([\\d,]+).*==>\\s*(\\d+)\\s*#SUP:\\s*(\\d)\\s*#CONF:\\s*(\\d+.\\d+)".
"([\\d,]+).*==>\\s*(\\d+)\\s*#SUP:\\s*(\\d)\\s*#CONF:\\s*(\\d+.\\d+)"
2> io:format("RE: /~s/~n", [RE]).
RE: /([\d,]+).*==>\s*(\d+)\s*#SUP:\s*(\d)\s*#CONF:\s*(\d+.\d+)/

对于问题的其余部分,answer提出了很好的rock321987