【问题标题】:Java regular expression to extract content within square or round bracketsJava正则表达式提取方括号或圆括号内的内容
【发布时间】:2019-01-30 04:17:09
【问题描述】:

我正在尝试提取方形或圆形内的字符串。字符串可能只有方括号或圆括号

我正在使用下面的正则表达式。

Pattern p = Pattern.compile("\\[(.*?)\\]|\\((.*?)\\)");

输出字符串也包括括号。下面是代码。

String example = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("\\[(.*?)\\]|\\((.*?)\\)");
Matcher m = p.matcher(example);
while(m.find()) {
    System.out.println(m.group(1));
}

上述模式给出的输出为

(xxxxx)

(yyyyy)

预期输出是

xxxxx

yyyyy

【问题讨论】:

  • 第 1 组应打印两次 null。在这种情况下,第 2 组将具有您需要的输出。

标签: java regex


【解决方案1】:

您可以编写一个不需要交替的正则表达式,并且只能拥有一个您可以唯一访问以获取值的组,如果您使用正则环视来捕获您的预期值,则更好,

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

说明:

  • (?&lt;=[([]) - 正面看后面,确保前面的字符是 ([
  • [^()[\]]* - 匹配除左括号或右括号之外的任何字符
  • (?=[)\]]) - 积极向前看,以确保它匹配 )]

Demo

示例 Java 代码,

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("(?<=[(\\[])[^()\\[\\]]*(?=[)\\]])");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

打印,

xxxxx
yyyyy

或者,就像我上面提到的那样,您可以使用这个非环顾正则表达式并仅捕获 group1 来获取您的内容,因为这个正则表达式没有任何交替,因此只有一个组。

[([]([^()[\]]*)[)\]]

Demo without lookaround regex

带有非环视正则表达式的 Java 代码示例,您需要使用 group(1) 捕获这些代码

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("[(\\[]([^()\\[\\]]*)[)\\]]");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

打印,

xxxxx
yyyyy

【讨论】:

    【解决方案2】:

    这是一个完整的例子。

    public class ExtractContentExample {
    
        private static final Pattern PATTERN2 = Pattern.compile("^[^\\(]{0,}\\(|([\\)][^\\(\\)]{1,}[\\(])|\\)[^\\)]{0,}$");
    
        public void test22212 () {
           String[] split = PATTERN2.split("(I )Comparison_(am )_AND_(so )_2019-01-28Comparison_(handsome!)");
           for (int i = 0; i< split.length; i++) {
               if (split[i] != null && !split[i].isEmpty()) {
                   System.out.println(split[i]);
               }
           }
       }
    
    }
    

    我希望这会有所帮助

    【讨论】:

    • 如果字符串在 Ex: "Comparison_(xxxx, xxxx, xxxx)_AND_(yyyy, yyyy, yyyy)_2019-01-28" 之间包含空格,则您的模式会给出部分结果。给出输出 xxxx 而不是 xxxx, xxxx, xxxx
    【解决方案3】:

    你可以使用lookahead and lookbehind:-

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

    或者您可以将德摩根定律应用于上述正则表达式并使用:-

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

    说明

    (?&lt;=\[|\() - 前面是 [(
    .*? - 任意数量的字符,非贪婪
    (?=\]|\)) - 后面是 ])

    Demo

    【讨论】:

    • @RachanRK 你在哪里提到过这个问题?
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多