我很难尝试将以下正则表达式转换为erlang语法。
我所拥有的是这样的测试字符串:
1,2 ==> 3 #SUP: 1 #CONF: 1.0
我使用regex101创建的正则表达式是这样的(见下文):
([\d,]+).*==>\s*(\d+)\s*#SUP:\s*(\d)\s*#CONF:\s*(\d+.\d+)
但如果我将它转换为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
答案 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。