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

Regex to capture words between the first colon : and the last square brackets having colon : in it

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

00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]

注意最后一个方括号中有一个 : 冒号。 Some More 之前的字符也是冒号。我想捕获它们之间的所有字符。

目前我正在用下面的正则表达式将其解析为两个 steps.Here 是 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 中做到这一点?

您可以使用以下正则表达式来提取匹配项:

\[[^\]\[]*\]:\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^^@#]

您可以使用这个单一的正则表达式来捕获您想要的字符串:

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

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