正则表达式捕获第一个冒号:和最后一个带有冒号:的方括号之间的单词

时间:2019-03-27 11:10:35

标签: java regex regex-group

我有一个要解析的字符串。 字符串是这样的:-

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中做到这一点?

2 个答案:

答案 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)

您可以使用此正则表达式捕获所需的字符串:

(?<=\]: ).*(?=\[)

Demo

在这里,(?<=\]: )积极地匹配]:,从字面上匹配您提到的数据,从那时起,贪婪地捕获所有内容,直到看到最后一个[,其中也包含冒号,尽管既然那是您想要捕获的关键点,但我没有进一步限制冒号。

但是如果您还想强制执行它应该在[something1:something2]之前停止匹配,则可以使用此正则表达式,

(?<=\]: ).*(?=\[[^[\]]*:[^[\]]*\])

Demo with a finer regex

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^^@#]