gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:55:18 25 4
gpt4 key购买 nike

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

这是一个示例字符串:

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

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

  • 西洋跳棋等:Blue::C
  • 西洋双陆棋,我说:Green::Pepsi:P
  • Chess, misc:White:Coke:Florida:A
  • :::U

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

([^:]*:[^:]*){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

再次感谢!

最佳答案

我建议这种模式:

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

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

demo

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

关于java - 如何编写一个正则表达式捕获组,它在分隔符之前匹配一个字符 3 次或 4 次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58456464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com