如何解决这个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”。
我该如何解决这个问题? (或者是否需要使用多个模式,其中第一个模式剥离括号?)
答案 0 :(得分:1)
在[ ]
之间获取字符串,然后用逗号分隔。这更容易。
答案 1 :(得分:1)
三点建议:
如果字符串只能在括号之间出现,那么您根本不需要检查它们,只需使用"[^"]*"
作为正则表达式并找到所有匹配项(假设没有转义引号)。
如果这不起作用,因为字符串也可能出现在其他地方,您不想捕获它们,请分两步完成。
\[[^\]]*\]
。"[^"]*"
的所有出现次数。甚至可以使用JSON解析器来读取该字符串。第三种可能性,作弊:
搜索"[^"\[\]]*"(?=[^\[\]]*\])
。仅当下一个括号是结束括号时,才匹配字符串。限制:字符串内不允许使用括号。我认为这很难看,特别是如果你看看它在Java中会是什么样子:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
你认为在几个月内看到这个的人能说出它在做什么吗?