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

时间:2015-03-26 15:35:47

标签: java regex match

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

它匹配引号内的每个字符,并自行排除引号。

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

"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"

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

3 个答案:

答案 0 :(得分:3)

要使正则表达式与逗号不匹配,您需要删除外观并使用捕获组在双引号之间获取内容。因为lookarounds是与任何字符都不匹配的断言。因此,在此"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

答案 1 :(得分:0)

为什么不尝试这个?

"(.*?)"

表示字符串&#34;一个&#34;,&#34;两个&#34; ,&#34;三&#34;,&#34;四&#34; :匹配将是:

one
two
three
four

见这里:Regex101

希望它有所帮助。

答案 2 :(得分:0)

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

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

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