如果要使用匹配,则必须匹配整个字符串。
^(?:(?:abc|cde);[a-z_]+|g;4)(?:,(?:(?:abc|cde);[a-z_]+|g;4))*$
解释
^字符串的开始
(?:非捕获组
(?:abc|cde);[a-z_]+匹配abc;orcde;和 1+ 字符 az or_
|或者
g;4从字面上匹配
)关闭非捕获组
(?:非捕获组
,(?:(?:abc|cde);[a-z_]+|g;4)匹配逗号,并重复第一个模式
)*关闭非捕获组并可选择重复
$字符串结束
查看正则表达式演示和Java 演示
示例代码
String[] strings = {
"abc;erga_sd,cde;dfgef,g;4",
"g;4,abc;dsfaweg",
"cde;df_ger",
"g;4",
"abc;dsfg,dfvser"
};
String regex = "^(?:(?:abc|cde);[a-z_]+|g;4)(?:,(?:(?:abc|cde);[a-z_]+|g;4))*$";
Pattern pattern = Pattern.compile(regex);
for (String s : strings) {
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
System.out.printf("Match for %s%n", s);
} else {
System.out.printf("No match for %s%n", s);
}
}
输出
Match for abc;erga_sd,cde;dfgef,g;4
Match for g;4,abc;dsfaweg
Match for cde;df_ger
Match for g;4
No match for abc;dsfg,dfvser
如果不应该有任何重复abc; cde,或者g;4您可以使用带有反向引用的负前瞻来排除这种情况,以便在模式开始时匹配相同的两次。
^(?!.*(abc;|cde;|g;4).*\1)(?:(?:abc|cde);[a-z_]+|g;4)(?:,(?:(?:abc|cde);[a-z_]+|g;4))*$
正则表达式演示