基于运行时的动态正则表达式



我正在尝试编写一个regex,它接受一个固定的已知不允许字符列表+一个来自运行时配置的动态不允许列表。

这是代码示例。disallowedChars是已知列表,additioanlDisallowedChars来自运行时配置,推送配置后可以更改。

public static final String disallowedChars = "[^ u2028 u2029 u0000-u001f]+";
public final String additioanlDisallowedChars = "";//TODO: HOW TO?
public static final Pattern NAME_PATTERN = Pattern.compile(disallowedChars);
public static void main(String[] args) {
String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
System.out.println(NAME_PATTERN.matcher(vowels).matches());
System.out.println(NAME_PATTERN.matcher("au2029u0000").matches());
}

我知道我每次都可以创建一个新的模式,但据我所知,这很昂贵,所以我想知道是否有更好的方法来检查额外的不允许列表。最好使用regex,因为它会很干净,但其他有效的方法也受到的欢迎

如果将disallowedChars的格式从正则表达式模式字符串更改为仅字符串,则可以将disallowedCharsadditionalDisallowedChars连接起来,并以"[^"one_answers"]+";像您的原始regex字符串一样,然后编译并使用它。

public static final String disallowedChars = "u2028u2029u0000-u001f";
public static final String additionalDisallowedChars = GetAdditionalDisallowedChars();
public static final String regex = "[^" + disallowedChars + additionalDisallowedChars + "]+";
public static final Pattern NAME_PATTERN = Pattern.compile(regex);
public static void main(String[] args) {
String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
System.out.println(NAME_PATTERN.matcher(vowels).matches());
System.out.println(NAME_PATTERN.matcher("au2029u0000").matches());
}
public static String GetAdditionalDisallowedChars() {
return "..."; // read from config
}

一些额外的反馈项目。。。

  1. 您的disallowedChars字符串包含多个空格。我不确定是否要排除空格,但字符之间不需要空格。在我的代码中,我删除了所有的空格。如果你需要的话,再加一个。

  2. 我更正了additionalDisallowedChars变量名称中的拼写错误。

最新更新