带有固定启动和重复块的字符串的Java正则表达式

时间:2016-01-11 21:02:19

标签: java regex find matcher

考虑一行文字,如

"ab,""c"",""d"",""e"",""""

上面的行有一个固定的开始"ab,然后重复像

这样的块
,""<non-quote(s)>""

(即逗号,后跟2个双引号,后跟0个或更多个非引号,后跟2个引号),可能为空块(即4个连续引号"""")。

这样的正则表达式
  • (?:&#34 +([^&#34;,] *)&#34 +)

将匹配所有块(即包含第一个逗号的所有内容),但不包括固定的开头。

使用&#34;或&#34; (|)条款,如

  • (?:&#34;([^,] +)|,&#34 +([^&#34;,] *)&#34 +)

有效,但有两组,其中#1是第一轮matcher.find()中的固定开始,其余为null,而#2是null第一次调用并在所有其他调用中正确填充。

是否有一个有效的Java正则表达式,它产生一个单独的组,对于matcher.find()的连续调用,首先返回固定的开始,然后返回每个重复的块?

1 个答案:

答案 0 :(得分:2)

我认为这是您正在寻找的模式:

"{1,2}([^",]*)(?:"")?(?:,|$)

或者作为Java字符串:

\"{1,2}([^\",]*)(?:\"\")?(?:,|$)

然后在第1组(唯一捕获的组)中获得所需的值。

请注意,此正则表达式仅对分割字符串有用,但不适用于验证字符串。此外,它不支持 [,] [&#34; ] 在其中。

这里有一个用法示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class MatcherTest {
    private static String text = "\"ab,\"\"c\"\",\"\"d\"\",\"\"e\"\",\"\"\"\"";

    private static String patternString = "\"{1,2}([^\",]*)(?:\"\")?(?:,|$)";

    public static void main(final String[] args) throws java.lang.Exception {
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("'" + matcher.group(1) + "'");
        }
    }
}