正则表达式:如何捕获这个? (重复组内的嵌套组)

时间:2011-11-10 13:36:32

标签: java regex

如何解决这个Java正则表达式问题?

输入:

some heading text... ["fds afsa","fwr23423","42df f","1a_4(211@#","3240acg!g"] some trailing text....

问题:我想捕捉双引号之间的所有内容。 (例如:fds afsa,fwr23423等)

我尝试过以下模式:

\[(?:"([^"]+)",?)+\]

但是当执行Matcher.find()时,它会导致StackOverflowError,当使用更大的输入时(但是对于小输入有效,这是Java中的错误)。即使它确实有效,matcher.group(1)也只会给出“3240acg!g”。

我该如何解决这个问题? (或者是否需要使用多个模式,其中第一个模式剥离括号?)

2 个答案:

答案 0 :(得分:1)

[ ]之间获取字符串,然后用逗号分隔。这更容易。

答案 1 :(得分:1)

三点建议:

如果字符串只能在括号之间出现,那么您根本不需要检查它们,只需使用"[^"]*"作为正则表达式并找到所有匹配项(假设没有转义引号)。

如果这不起作用,因为字符串也可能出现在其他地方,您不想捕获它们,请分两步完成。

  1. 匹配\[[^\]]*\]
  2. 在第一场比赛的结果中查找"[^"]*"的所有出现次数。甚至可以使用JSON解析器来读取该字符串。
  3. 第三种可能性,作弊:

    搜索"[^"\[\]]*"(?=[^\[\]]*\])。仅当下一个括号是结束括号时,才匹配字符串。限制:字符串内不允许使用括号。我认为这很难看,特别是如果你看看它在Java中会是什么样子:

    List<String> matchList = new ArrayList<String>();
    Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
    

    你认为在几个月内看到这个的人能说出它在做什么吗?