Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取双引号之间字符的Java正则表达式_Java_Regex - Fatal编程技术网

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

获取双引号之间字符的Java正则表达式,java,regex,Java,Regex,我需要找出一个正则表达式模式,以便能够获得双引号之间的字符 这有点难以解释,但以下是我想要的: 如果我通过所说的表达式来运行: say("ex" + "ex2", "ex3"); Pattern.compile("\\\"(.*)\\\""); 然后我将能够得到三场比赛,分别是 "ex", "ex2", and "ex3" 一切都在他们自己的范围内 我已经试过这个表达: say("ex" + "ex2", "ex3"); Pattern.compile("\\\"(.*)\\\"");

我需要找出一个正则表达式模式,以便能够获得双引号之间的字符

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

如果我通过所说的表达式来运行:

say("ex" + "ex2", "ex3");
Pattern.compile("\\\"(.*)\\\"");
然后我将能够得到三场比赛,分别是

"ex", "ex2", and "ex3"
一切都在他们自己的范围内

我已经试过这个表达:

say("ex" + "ex2", "ex3");
Pattern.compile("\\\"(.*)\\\"");
但我没有给我三个不同的组,而是得到一个组,分别是ex,ex2和ex3


那么,有人知道一个表达式来提供我想要的输出吗?

您可以使用非贪婪的方法来实现这一点:

"\\\"(.*?)\\\""
一个非贪婪的群体从可能的那一刻起就开始切割。在这种情况下,从找到第二个双引号开始

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

"(\\\"[^\"]*)\\\")"
[^list]指除列表中的字符外的所有字符

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

"[\"]([^\"]*)[\"]"
此外,请注意,这不适用于递归模式:如果要匹配的字符串是foo-inner-bar,那么它将匹配foo而不是foo-inner-bar,但我想这就是我们要寻找的语义

编辑:

如果还允许转义双引号,则可以使用负查找:

"([\"][^\"]*(?<!\\\\)[\"])"
这用于指定字符串Foo\a real backspace

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

"([\"]([^\\\\\"]*([\\\\].)*)*[\"])"
未scaped此正则表达式是:

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

如图所示,它从stdin中读取一个原始字符串并输出捕获的组。

您可以使用非贪婪方法执行此操作:

"\\\"(.*?)\\\""
一个非贪婪的群体从可能的那一刻起就开始切割。在这种情况下,从找到第二个双引号开始

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

"(\\\"[^\"]*)\\\")"
[^list]指除列表中的字符外的所有字符

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

"[\"]([^\"]*)[\"]"
此外,请注意,这不适用于递归模式:如果要匹配的字符串是foo-inner-bar,那么它将匹配foo而不是foo-inner-bar,但我想这就是我们要寻找的语义

编辑:

如果还允许转义双引号,则可以使用负查找:

"([\"][^\"]*(?<!\\\\)[\"])"
这用于指定字符串Foo\a real backspace

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

"([\"]([^\\\\\"]*([\\\\].)*)*[\"])"
未scaped此正则表达式是:

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

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

嘿,这很有效,但假设我有这样一个:这是一个\string\n那么它将不起作用,你知道解决方法吗?@bernhardkiv:你试过涂鸦吗?请注意,您必须双引号引字符串以引入硬退格…嗯,我不确定我是否清楚,我希望它匹配这是一个\string\all-in-one组,我之所以转义引号是因为我在eclipse中使用纯文本。这够清楚吗/@伯恩哈德基夫:那只是放括号的问题。更新了answer和jdoodle。我尝试了jdoodle,但也不起作用,它只是输出了以下内容:输入:这是一个字符串嘿,效果很好,但举个例子,我有一个:这是一个\string\n那么它将不起作用,你知道解决方法吗?@bernhardkiv:你尝试过涂鸦吗?请注意,您必须双引号引字符串以引入硬退格…嗯,我不确定我是否清楚,我希望它匹配这是一个\string\all-in-one组,我之所以转义引号是因为我在eclipse中使用纯文本。这够清楚吗/@伯恩哈德基夫:那只是放括号的问题。更新了answer和jdoodle。我尝试了jdoodle,但也不起作用,它只输出了以下内容:输入:这是一个字符串