我有一个代码,可以解析java类字段的逗号分隔名称,也可以解析带有类名和点运算符的字段名称(即外部字段(,还可以设置/数组式表示法来引用多个外部字段,而不必多次使用类名:例如,以下是有效的场景:
- MyField1,MyField2,AnotherClass。ACField1、AnotherClass2[AC2Field1、AC2Field2、AC2Field3]
- 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+)*\])?)*$";