我有这个原始数据:
one:1,two:2;one:11;one:111,two:222;one:1111,two:2222;one:11111,two:22222;
扩展数据:
one:1 two:2
one:11
one:111 two:222
one:1111 two:2222
one:11111 two:22222
(您可以看到第二组中没有第二名。)
现在,我需要获取所有数字。我写这种模式:
one:(.*?),two:(.*?);
但是它在第2个匹配项中返回错误的值,请参阅:
Match 2
Full match `one:11;one:111,two:222;`
Group 1. `11;one:111`
Group 2. `222`
我的期望值:
Match 2
Full match `one:11;`
Group 1. `11`
Group 2. ``
在线查看: https://regex101.com/r/Qm9tKG/1
您能建议我解决该模式吗?
答案 0 :(得分:2)
您可以将此正则表达式与可选匹配和分支重置组一起使用:
one:(\d+)(?|,two:(\d+)|());
RegEx详细信息:
one:
:匹配文字'one:
(\d+)
:第一个捕获组。匹配1个或多个数字(?|
:启动分支重置组
,two:
:匹配文字,two:
(\d+)
:第二个捕获组。匹配1个或多个数字|
:或()
:一个空组,将被编号为第二个捕获组 )
:结束分支重置组;
:匹配文字;
答案 1 :(得分:1)
这里是您可以尝试的一种选择:
(one:\d+[,;]((?!one:\d+[,;]).)*)
基本思想是匹配第一个one
条目之后出现的所有内容,前提是它不再是另一个one
条目。上面的模式生成了以下匹配项:
Match 1
Full match 0-12 `one:1,two:2;`
Match 2
Full match 12-19 `one:11;`
Match 3
Full match 19-35 `one:111,two:222;`
Match 4
Full match 35-53 `one:1111,two:2222;`
Match 5
Full match 53-73 `one:11111,two:22222;`
要生成确切的预期输出,如果您确实不希望出现标点符号,那么我将执行另一步骤来格式化和删除标点符号。