0

我正在寻找一种方法来匹配包含一些预定义字符和一些使用 JavaString#matches方法的变量字符的参数列表。例如:

可能的参数 1:abc;[variable lowercase letters with maybe an underscore]

可能的参数 2:cde;[variable lowercase letters with maybe an underscore]

可能的参数 3:g;4

示例 1:abc;erga_sd,cde;dfgef,g;4

示例 2:g;4,abc;dsfaweg

示例 3:cde;df_ger

每个参数都将以逗号分隔,但它们可以按任何顺序出现,包括 1、2 和/或 3(无重复)

这是我到目前为止部分有效的正则表达式: (abc;[a-z_,]+){0,1}|(cde;[a-z,]+){0,1}|(g;4,){0,1}

问题是它还发现类似这样的内容有效:abc;dsfg,dfvser逗号后字符串的开头不是以有效的abc;cde;g;4

4

2 回答 2

1

如果要使用匹配,则必须匹配整个字符串。

^(?:(?: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))*$

正则表达式演示

于 2021-08-12T20:29:56.060 回答
1

如你所说:

问题是它还发现类似这样的内容有效: abc;dsfg,dfvser 其中逗号后字符串的开头不是以有效的 abc 开头;或 cde;或 g;4

因此,有效条目将始终具有逗号后的模式。您可以做的是,您可以使用分隔符拆分每个输入","并将有效的正则表达式模式应用于拆分元素,然后组合拆分元素的匹配结果以获得整个输入行的匹配结果。

你的正则表达式应该是:

(abc;[a-z_]+)|(cde;[a-z_]+)|(g;4)

您将获得这三种模式中的任何一种,就像您之前在帖子中提到的那样,在您通过在输入行上进行拆分获得的有效元素中。

这是代码:

String regex = "(abc;[a-z_]+)|(cde;[a-z_]+)|(g;4)";
boolean finalResult = true;
for (String input: inputList.split(",")) {
    finalResult = finalResult && Pattern.matches(regex,input);
}
System.out.println(finalResult);
于 2021-08-08T01:32:04.010 回答