如何编写一个正则表达式捕获组,它在分隔符之前匹配一个字符 3 次或 4 次?

How to write a regex capture group which matches a character 3 or 4 times before a delimiter?

我正在尝试编写一个根据分隔符将元素拆分出来的正则表达式。正则表达式还需要确保理想情况下有 4 个,但每个匹配项中至少有 3 个冒号 :

这是一个示例字符串:

"Checkers, etc:Blue::C, Backgammon, I say:Green::Pepsi:P, Chess, misc:White:Coke:Florida:A, :::U"

据此,应该有4个匹配项:

这是我到目前为止尝试过的方法:

([^:]*:[^:]*){3,4}(?:, )

正则表达式 101 位于:https://regex101.com/r/O8iacP/8

我尝试为 ,

设置一个非捕获组

然后我尝试匹配一组不是 : 的任何字符、: 和任何不是 : 的字符 3 或 4 次。

我用来迭代这些组的代码是:

String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "([^:]*:[^:]*){3,4}(?:, )";

  // Create a Pattern object
  Pattern r = Pattern.compile(pattern);

  // Now create matcher object.
  Matcher matcher = r.matcher(line);
  while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

感谢任何帮助!

编辑

使用@Casimir 的正则表达式,它正在工作。我不得不像这样更改上面的代码以使用 group(0):

String line = "Checkers, etc:Blue::C, Backgammon, I say::Pepsi:P, Chess:White:Coke:Florida:A, :::U";
String pattern = "(?![\s,])(?:[^:]*:){3}\S*(?![^,])";

// Create a Pattern object
Pattern r = Pattern.compile(pattern);

// Now create matcher object.
Matcher matcher = r.matcher(line);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

现在打印:

Checkers, etc:Blue::C
Backgammon, I say::Pepsi:P
Chess:White:Coke:Florida:A
:::U

再次感谢!

您可能会使用

(?:[^,:]+, )?[^:,]*(?::+[^:,]+)+
  • (?:[^,:]+, )? 可选择匹配 1+ 任何字符,除了 ,: 后跟 , 和 space
  • [^:,]* 匹配 0+ 除 :,
  • 之外的任何字符
  • (?: 非捕获组
    • :+[^:,]+ 匹配 1+ : 和 1+ 次除 :,
    • 之外的任何字符
  • )+关闭群重复1+次

Regex demo

我建议这个模式:

(?![\s,])(?:[^:]*:){3}\S*(?![^,])

负前瞻避免匹配前导或尾随定界符。第二个特别强制匹配后跟定界符或字符串结尾(后跟不是逗号的字符)。

demo

请注意,该模式没有捕获组,因此结果是整个匹配项(或组 0)。

你似乎让前瞻变得比它需要的更难(无论如何在行尾都不会满足)。

([^:]*:){3}[^:,]*:?[^:,]*

找到前 3 个 :,然后开始将 , 包括在否定分组中,可选的第 4 个 :.