如何编写一个正则表达式捕获组,它在分隔符之前匹配一个字符 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个匹配项:
Checkers, etc:Blue::C
Backgammon, I say: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
再次感谢!
您可能会使用
(?:[^,:]+, )?[^:,]*(?::+[^:,]+)+
(?:[^,:]+, )?
可选择匹配 1+ 任何字符,除了 ,
或 :
后跟 ,
和 space
[^:,]*
匹配 0+ 除 :
或 ,
之外的任何字符
(?:
非捕获组
:+[^:,]+
匹配 1+ :
和 1+ 次除 :
和 ,
之外的任何字符
)+
关闭群重复1+次
我建议这个模式:
(?![\s,])(?:[^:]*:){3}\S*(?![^,])
负前瞻避免匹配前导或尾随定界符。第二个特别强制匹配后跟定界符或字符串结尾(后跟不是逗号的字符)。
请注意,该模式没有捕获组,因此结果是整个匹配项(或组 0)。
你似乎让前瞻变得比它需要的更难(无论如何在行尾都不会满足)。
([^:]*:){3}[^:,]*:?[^:,]*
找到前 3 个 :
,然后开始将 ,
包括在否定分组中,可选的第 4 个 :
.
我正在尝试编写一个根据分隔符将元素拆分出来的正则表达式。正则表达式还需要确保理想情况下有 4 个,但每个匹配项中至少有 3 个冒号 :
。
这是一个示例字符串:
"Checkers, etc:Blue::C, Backgammon, I say:Green::Pepsi:P, Chess, misc:White:Coke:Florida:A, :::U"
据此,应该有4个匹配项:
Checkers, etc:Blue::C
Backgammon, I say: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
再次感谢!
您可能会使用
(?:[^,:]+, )?[^:,]*(?::+[^:,]+)+
(?:[^,:]+, )?
可选择匹配 1+ 任何字符,除了,
或:
后跟,
和 space[^:,]*
匹配 0+ 除:
或,
之外的任何字符
(?:
非捕获组:+[^:,]+
匹配 1+:
和 1+ 次除:
和,
之外的任何字符
)+
关闭群重复1+次
我建议这个模式:
(?![\s,])(?:[^:]*:){3}\S*(?![^,])
负前瞻避免匹配前导或尾随定界符。第二个特别强制匹配后跟定界符或字符串结尾(后跟不是逗号的字符)。
请注意,该模式没有捕获组,因此结果是整个匹配项(或组 0)。
你似乎让前瞻变得比它需要的更难(无论如何在行尾都不会满足)。
([^:]*:){3}[^:,]*:?[^:,]*
找到前 3 个 :
,然后开始将 ,
包括在否定分组中,可选的第 4 个 :
.