Regex,用于验证逗号分隔的java字段、引用字段和Set



我有一个代码,可以解析java类字段的逗号分隔名称,也可以解析带有类名和点运算符的字段名称(即外部字段(,还可以设置/数组式表示法来引用多个外部字段,而不必多次使用类名:例如,以下是有效的场景:

  1. MyField1,MyField2,AnotherClass。ACField1、AnotherClass2[AC2Field1、AC2Field2、AC2Field3]
  2. MyField1、MyField2

我已经编写了以下regex/java代码:但请参阅主方法中的最后一行(即上面的第一个示例(。它应该是有效的,但是regex不匹配。

import java.util.regex.Pattern;
public class RegexTest {
static Pattern fieldListPattern = Pattern.compile("^(\w+)(([.,]\w+)|([\[]\w+([,]?\w+)[\]]))*$");
public static void main(String[] args) {
validate("MyField1,MyField2"); // valid
validate("ABC,A.CDE"); // valid
validate("ABC"); // valid
validate("ABC,CDE"); // valid
validate("ABC.CDE"); // valid
validate("ABC,.CDE"); // XXXXXXX
validate("ABC.,CDE"); // XXXXXXX
validate(",ABC,CDE"); // XXXXXXX
validate(",ABC"); // XXXXXXX
validate(".ABC"); // XXXXXXX
validate(".ABC.CDE"); // XXXXXXX
validate(".ABC,CDE"); // XXXXXXX
validate(",ABC.CDE"); // XXXXXXX
// arrays
validate("ABC[CDE]"); // Valid
validate("ABC[]"); // XXXXXXX
validate("ABC.[CDE]"); // XXXXXXX
validate("MyField1,MyField2,AnotherClass.ACField1,AnotherClass2[AC2Field1,AC2Field2]"); // Valid
validate("MyField1,MyField2,AnotherClass.ACField1,AnotherClass2[AC2Field1,AC2Field2,AC2Field3]"); // This should be valid, but coming as invalid
}
static void validate(String s) {
System.out.println(s);
fieldListPattern.matcher("").matches();
System.out.println("Valid ? " + fieldListPattern.matcher(s).matches());
}
}

作为一种模式,您可以选择从开始方括号到结束方括号重复匹配:

^w+(?:[w+(?:,w+)*])?(?:[.,]w+(?:[w+(?:,w+)*])?)*$
  • ^字符串开始
  • w+匹配1+个单词字符
  • (?:[w+(?:,w+)*])?(可选(匹配方括号中用逗号分隔的单词字符
  • (?:非捕获组
    • [.,]匹配.,
    • w+(?:[w+(?:,w+)*])*
  • )?关闭组并将其设为可选
  • $字符串结束

Regex演示

在Java中使用双转义反斜杠:

String regex = "^\w+(?:\[\w+(?:,\w+)*\])?(?:[.,]\w+(?:\[\w+(?:,\w+)*\])?)*$";

最新更新