我需要找出一个正则表达式(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"
那么有谁知道一个表达式给我我想要的输出?
你可以使用非贪婪的方法来做到这一点:
"\\\"(.*?)\\\""
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并输出捕获的组.
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |