我有一个要解析的字符串。 字符串是这样的:-
00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]
请注意,最后一个方括号中带有:冒号。并且 Some More 之前的字符也是冒号。我想捕获它们之间的所有字符。
目前,我正在使用以下正则表达式分两步对其进行解析。以下是Java代码。
class JavaReg{
public static void main(String[] args){
String str = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
String[] strArr = str.split("\\[.*?\\]\\:\\s");
String[] str12 = strArr[1].split("\\[\\w*?\\:.*");
for(String strinj : strArr)
System.out.println(strinj);
System.out.println(str12[0]);
}
}
以下是上述练习的结果。
00:0qwe8.0 donald controller duck
Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]
Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]
最后一个字符串是我想要的。它开始从冒号开始捕获:并继续捕获直到带有冒号的方括号。
问题是我可以使用正则表达式中的捕获组来一次捕获它。 如何在Java中做到这一点?
答案 0 :(得分:1)
您可以使用以下正则表达式提取匹配项:
\[[^\]\[]*\]:\s*(.*?)\[\w*:
请参见regex demo。
详细信息
\[
-一个[
字符[^\]\[]*
-除]
和[
之外的0+个字符\]:
-一个]:
子字符串\s*
-超过0个空格(.*?)
-第1组:除换行符以外的任何0个或多个字符,并且尽可能少\[
-[
字符\w*
-0个字母,数字或_
:
-冒号。与Matcher#find()
一起使用并抓住matcher.group(1)
,请参阅Java demo:
String str = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
Pattern pattern = Pattern.compile("\\[[^\\]\\[]*\\]:\\s*(.*?)\\[\\w*:");
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
System.out.println(matcher.group(1));
}
// => Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]
答案 1 :(得分:1)
您可以使用此正则表达式捕获所需的字符串:
(?<=\]: ).*(?=\[)
在这里,(?<=\]: )
积极地匹配]:
,从字面上匹配您提到的数据,从那时起,贪婪地捕获所有内容,直到看到最后一个[
,其中也包含冒号,尽管既然那是您想要捕获的关键点,但我没有进一步限制冒号。
但是如果您还想强制执行它应该在[something1:something2]
之前停止匹配,则可以使用此正则表达式,
(?<=\]: ).*(?=\[[^[\]]*:[^[\]]*\])
Java代码
String s = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
Pattern p = Pattern.compile("(?<=\\]: ).*(?=\\[[^\\[\\]]*:[^\\[\\]]*\\])");
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group());
}
打印:
Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]