帮助解决一组缺乏价值的正则表达式模式

时间:2018-08-18 16:44:43

标签: regex

我有这个原始数据:

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

您能建议我解决该模式吗?

2 个答案:

答案 0 :(得分:2)

您可以将此正则表达式与可选匹配分支重置组一起使用:

one:(\d+)(?|,two:(\d+)|());

RegEx详细信息:

  • one::匹配文字'one:
  • (\d+)第一个捕获组。匹配1个或多个数字
  • (?|:启动分支重置组
    • ,two::匹配文字,two:
    • (\d+)第二个捕获组。匹配1个或多个数字
    • |:或
    • ():一个空组,将被编号为第二个捕获组
  • ):结束分支重置组
  • ;:匹配文字;

Updated RegEx Demo

答案 1 :(得分:1)

这里是您可以尝试的一种选择:

(one:\d+[,;]((?!one:\d+[,;]).)*)

Demo

基本思想是匹配第一个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;`

要生成确切的预期输出,如果您确实不希望出现标点符号,那么我将执行另一步骤来格式化和删除标点符号。