我需要找出一个正则表达式(Pattern)才能在双引号之间获取字符。
这有点难以解释,但这就是我想要的:
如果我通过上述表达式执行此操作:
say("ex" + "ex2", "ex3");
然后我将能够获得三场比赛,这是;
"ex", "ex2", and "ex3"
都在他们自己的字符串中。
我已经尝试过这个表达式:
Pattern.compile("\\\"(.*)\\\"");
但是我没有给我三个不同的.group()
,而是.group
<{1}} "ex", "ex2", and "ex3"
所以有人知道一个表达式给我想要的输出吗?
答案 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
读取原始字符串并输出捕获的组。