【问题标题】:Regex to capture words between the first colon : and the last square brackets having colon : in it正则表达式捕获第一个冒号 : 和最后一个方括号之间的单词,其中包含冒号 :
【发布时间】:2019-03-27 11:10:35
【问题描述】:

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

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

【问题讨论】:

标签: java regex regex-group


【解决方案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^^@#]

【讨论】:

  • 是的,两个答案都很好,我也很纠结,另一个来得早,所以我选择了它。但是谢谢先生。
  • @JohnDoe 我的答案是在 11:18:32 发布的,另一个是在 11:18:40 发布的。我的答案之前已发布。
  • Done dude done,但请从你的回答中解释这一点[[^][]*]
  • @JohnDoe 这是一个negated character class,匹配任何不属于指定字符集的单个字符。因此,它匹配除[] 之外的任何字符。这些内部必须被转义,因为它们用于形成字符类联合和交集。
  • @JohnDoe [^\]\[] 可以写成[^\[\]]。就是这样。
【解决方案2】:

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

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

Demo

在这里,(?&lt;=\]: ) 这个正面的外观与 ]: 相匹配,就像你提到的那样匹配你的数据,从那时起,贪婪地捕获所有东西,直到它看到最后一个 [,它也包含一个冒号,尽管因为这就是你想要捕获的地方,我没有进一步限制冒号。

但如果你还想强制它应该在 [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^^@#]

【讨论】:

  • (.*) 我可以理解您正在使用它来捕获组,但请解释一下您的正则表达式。
  • 谢谢,但请进一步澄清这一点 (?
  • (?&lt;=]: ) 这称为表达式后面的正向查看,并标记前面正好是 ]: 文字的点。注意它有 ] : 和一个空格。 Check the pink pointer in this regex 表示捕获开始。
  • 所以这是 (?=[) 正向预测,它匹配最后一个 [(方括号)正确吗?
  • 是的,不是(?=[),但(?=\[) 转义[ 是必要的,因为[ 在正则表达式中有特殊含义。但是,如果您希望比赛在 [something:something] 之前停止,那么更好的正则表达式是 (?=\[[^[\]]*:[^[\]]*\]),这将确保它只在包含冒号的括号处停止,不管它是否是最后一个. Check the pink pointer in this regex 显示结束标记,直到数据将被捕获。
猜你喜欢
  • 2013-01-26
  • 2022-08-09
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多