正则表达式以提取方括号和括号内的内容

时间:2020-02-28 11:53:35

标签: java regex

是否存在可以将方括号和括号的内容提取到列表或数组中的表达式?这就是我所拥有的,它提取括号中的完整字符串。我只想要括号中的文字。

String example = "[21](BULK(KIN[1[35]](MARK)))";    
Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(example);
while(m.find()) {
    System.out.println(m.group(1));    
}

4 个答案:

答案 0 :(得分:0)

通过指定应该忽略哪些字符并在整个String上无限重复该字符来做到这一点,就像这样:

[^\[\]\(\)]+

最后的+避免匹配空匹配项。 不过,这不会检查设置的括号和括号是否正确。

我的代码如下:

String example = "[21](BULK(KIN[1[35]](MARK)))";
Matcher m = Pattern.compile("[^\\[\\]\\(\\)]+").matcher(example);
while(m.find()) {
    System.out.print(m.group(0)+ " ");
}

java使用此字符作为转义符本身会产生双反斜杠。另外请注意,我更改了打印语句,使其行为与您在问题下方的注释中所述的一样。

答案 1 :(得分:0)

如果您只想提取字母组成的部分,则可以搜索以下内容:

Matcher m = Pattern.compile("([a-zA-Z]+)").matcher(example);

,然后在while循环中收集匹配项。 编辑:

Matcher m = Pattern.compile("(\\w+)").matcher(example);

提取所有单词文字,包括数字。

答案 2 :(得分:0)

您可以使用以下正则表达式提取感兴趣的字符串:

/(?<=\[|\()[^\[\]\(\)]+/x

对于字符串

"[21 is a winner](BULK(KIN[1[35]](MARK my man)))"

与此正则表达式的匹配为"21 is a winner""BULK""KIN""1""35""MARK my man"

正则表达式读取,“匹配一个或多个(+)字符,而不是(^字符串'[]()'[^\[\]\(\)]字符类),其后紧跟'(''['(?<=\[|\()正向后看)。

应注意,如果字符串的括号或括号不平衡,则可获得相同的结果:

"[21 is a winner((BULK]KIN(1[35]](MARK my man[[["

可以编写正则表达式来确认括号和括号是否平衡(使用子表达式),但是如果需要的话,将其分开检查会更简单。这可以通过创建一个空堆栈,然后使用以下规则逐个字符地处理字符串来完成:

  • 如果字符是'('或'[',则将其推入堆栈
  • 如果字符为')',且堆栈为非空,且顶部字符为'(',则弹出'(');否则括号不平衡
  • 如果字符为“]”且堆栈为非空且顶部字符为“ [”,则将“ [”弹出股票;其他括号不平衡
  • 如果字符不在字符串“()[]”中,则忽略它。
  • 如果处理了字符串中的所有字符,则当且仅当堆栈为空时,括号和方括号才会平衡。

请注意,在任何给定时间,堆栈仅包含字符'(''['

答案 3 :(得分:0)

您可以执行以下操作:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        String example = "[21](BULK(KIN[1[35]](MARK)))";
        Matcher m = Pattern.compile("\\w+").matcher(example);
        while (m.find()) {
            list.add(m.group());
        }

        System.out.println(list);

        // Array
        String[] arr = list.toArray(new String[0]);
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[21, BULK, KIN, 1, 35, MARK]
[21, BULK, KIN, 1, 35, MARK]