Java正则表达式提取方括号或圆括号内的内容

时间:2019-01-30 04:17:09

标签: java regex

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

我正在使用以下正则表达式。

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

  

3 个答案:

答案 0 :(得分:6)

您可以编写一个不需要进行正则表达式的正则表达式,并且可以只具有一个组,您可以唯一地访问该组以获得值,如果您使用正向环视法只是使用此正则表达式来捕获您的预期值,则更好,< / p>

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

说明:

  • (?<=[([])-确保前面的字符为([
  • 的积极眼光
  • [^()[\]]*-匹配除左括号或右括号之外的任何字符
  • (?=[)\]])-积极向前看,确保与)]匹配

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

答案 1 :(得分:3)

这是一个完整的示例。

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]);
           }
       }
   }

}

我希望这会有所帮助

答案 2 :(得分:2)

您可以使用lookahead and lookbehind:-

a = {1, 3, 5, 7};
b = {1, 2, 3, 4};
cellfun(@minus, a, b);

ans =

     0     1     2     3

或者您可以将De Morgan的定律应用于上述正则表达式并使用:-

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

说明

(?<=\[|\().*?(?=\]|\)) -前面有(?<=\[|\()[
(-任意数量的字符,非贪心
.*?-后跟(?=\]|\))]

Demo