匹配引号之间的任何内容,逗号除外

Match anything between quotes except commas

我有这个正则表达式:(?<=")(?:\.|[^"\])*(?=")

它匹配引号内的每个字符并排除引号本身。

当我尝试使用这样的字符串时:

"one","two","three"

也是匹配逗号,所以匹配结果如下:

one
,
two
,
three

有没有办法修改正则表达式以使其排除那些逗号?也就是说,输出是:

one
two
three

我需要在正则表达式中排除这些引号,并且不在匹配结果中包含逗号。

这是我的大正则表达式:

((0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.\d\d\d\d)|(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])|"((?:\.|[^"\])*)"

第一部分匹配日期:dd.mm.yyyy

((0[1-9]|[12][0-9]|3[01]).(0[1-9]|1[012]).\d\d\d\d)

第二部分匹配时间:hh:mm:ss

(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5] [0-9])

最后一个应该匹配引号之间的所有字符:

"((?:\.|[^"\])*)"

但是正则表达式的最后一部分不以不排除引号的方式工作。此外,出于某种原因,它会删除字符串中用引号引起来的所有空格。

输入是包含如下字符串的文本文件:

"AK Pz 310u PI-13-5","23.02.2015","07:45:00","23.02.2015","09:20:00","False","True","23.02.2015","07:40:00","2","Common","AK Pz 310u PI-13-5","Common"

预期输出是引号中的值数组(当然,没有逗号和引号本身)。我使用这么大的正则表达式来匹配日期和时间的原因是如果它们错了就不应该被匹配。

要使您的正则表达式不匹配逗号,您需要删除环视并使用捕获组来获取双引号之间的内容。因为环视是不匹配任何字符的断言。所以在这个 "one","two","three" 输入中,首先你的正则表达式匹配 one 然后它匹配下面的 ,,因为逗号也出现在双引号内。

"((?:\.|[^"\])*)"

此正则表达式强制匹配每个双引号字符串块。

Java 代码为,

String value = "\"one\",\"two\",\"three\"";
Matcher m = Pattern.compile("\"((?:\\.|[^\"\\])*)\"").matcher(value);
while(m.find())
{
    System.out.println(m.group(1));
}

输出:

one
two
three

DEMO

为什么不试试这个?

"(.*?)"

对于字符串 "one"、"two"、"three"、"four":匹配项将是:

one
two
three
four

看这里:Regex101

希望对您有所帮助。

我相信您正在尝试匹配引号之间的每组字母数字字符。如果是这种情况,您可以使用以下正则表达式:

(?<=")([a-zA-Z0-9]*)*(?=")

我通常使用像 https://regex101.com/ 这样的网站来测试我的正则表达式。很容易看出为什么匹配!你匹配你的逗号的原因是那些在技术上仍然是撇号之间的字符。