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

ber*_*kiv 1 java regex

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

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

如果我通过所述表达式运行:

say("ex" + "ex2", "ex3");
Run Code Online (Sandbox Code Playgroud)

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

"ex", "ex2", and "ex3"
Run Code Online (Sandbox Code Playgroud)

一切都在他们自己的弦乐.

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

Pattern.compile("\\\"(.*)\\\"");
Run Code Online (Sandbox Code Playgroud)

但不是给我三个不同的.group()S,我得到一个.group"ex", "ex2", and "ex3"

那么有谁知道一个表达式给我我想要的输出?

Wil*_*sem 6

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

"\\\"(.*?)\\\""
Run Code Online (Sandbox Code Playgroud)

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

或者例如匹配报价中的所有字符appart:

"(\\\"[^\"]*)\\\")"
Run Code Online (Sandbox Code Playgroud)

[^list] 表示除了中的字符之外的所有字符 list

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

"[\"]([^\"]*)[\"]"
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

"([\"][^\"]*(?<!\\\\)[\"])"
Run Code Online (Sandbox Code Playgroud)

(?<!\\\\)-转义(?<!\)-指一个字符之前,退格是不允许的.

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

"Foo\\"
Run Code Online (Sandbox Code Playgroud)

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

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

"([\"]([^\\\\\"]*([\\\\].)*)*[\"])"
Run Code Online (Sandbox Code Playgroud)

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

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

看到这个jdoodle,它从中读取一个原始字符串stdin并输出捕获的组.