考虑一行文字,如
"ab,""c"",""d"",""e"",""""
上面的行有一个固定的开始"ab
,然后重复像
,""<non-quote(s)>""
(即逗号,后跟2个双引号,后跟0个或更多个非引号,后跟2个引号),可能为空块(即4个连续引号""""
)。
像
这样的正则表达式将匹配所有块(即包含第一个逗号的所有内容),但不包括固定的开头。
使用&#34;或&#34; (|
)条款,如
有效,但有两组,其中#1是第一轮matcher.find()
中的固定开始,其余为null
,而#2是null
第一次调用并在所有其他调用中正确填充。
是否有一个有效的Java
正则表达式,它产生一个单独的组,对于matcher.find()
的连续调用,首先返回固定的开始,然后返回每个重复的块?
答案 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) + "'");
}
}
}