Java正则表达式,用于获取双引号之间的字符

时间:2015-02-12 17:45:19

标签: java regex

我需要找出一个正则表达式(Pattern)才能在双引号之间获取字符。

这有点难以解释,但这就是我想要的:

如果我通过上述表达式执行此操作:

say("ex" + "ex2", "ex3");

然后我将能够获得三场比赛,这是;

"ex", "ex2", and "ex3"

都在他们自己的字符串中。

我已经尝试过这个表达式:

Pattern.compile("\\\"(.*)\\\"");

但是我没有给我三个不同的.group(),而是.group <{1}} "ex", "ex2", and "ex3"

所以有人知道一个表达式给我想要的输出吗?

1 个答案:

答案 0 :(得分:5)

你可以使用非贪婪的方法来做到这一点:

"\\\"(.*?)\\\""

从一个可能的时刻开始的非贪婪的削减。在这种情况下,从找到第二个双引号的那一刻起。

或者例如匹配引号中的所有字符appart:

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

[^list]表示除list

中的字符以外的所有字符

此外,您可以通过省略双重转义来使其更具可读性:

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

此外请注意,这不适用于递归模式:如果要匹配的字符串是"foo "inner" bar",它将匹配"foo "而不是"foo "inner" bar",但我猜这是语义一个正在寻找。

修改

如果你也允许使用转义双引号,你可以使用负面的lookbehind:

"([\"][^\"]*(?<!\\\\)[\"])"

(?<!\\\\) - 未转义的(?<!\) - 表示之前的一个字符,不允许退格。

然而,这种方法的一个问题是,人们还可以指定一个字符串:

"Foo\\"

这用于指定字符串Foo\(真正的退格键)。

一个可能的解决方案是检查lookbehind是否包含奇数个连续的反斜杠,但Java不支持,解决方案是使匹配的内部循环更复杂:

"([\"]([^\\\\\"]*([\\\\].)*)*[\"])"

未转义这个正则表达式是:

(["]([^\\"]*([\\].)*)*["])
  ^    ^       ^       ^
  |    |       |       \- tailing double quote
  |    |       \- if backslash, skip next character (for instance `\\`, `\"` or `\n`
  |    \- match all except double quotes and backslashes
  \-beginning double quote

请参阅此jdoodle,它会从stdin读取原始字符串并输出捕获的组。