Java 基于运行时的动态正则表达式
我正在尝试编写一个正则表达式,它接受已知的不允许字符的固定列表+运行时配置中的动态不允许列表 下面是代码示例Java 基于运行时的动态正则表达式,java,regex,Java,Regex,我正在尝试编写一个正则表达式,它接受已知的不允许字符的固定列表+运行时配置中的动态不允许列表 下面是代码示例disallowedChars是已知的列表,AdditionalDisallowedChars来自运行时配置,可在推送配置后更改 public static final String disallowedChars = "[^ \u2028 \u2029 \u0000-\u001f]+"; public final String additioanlDisal
disallowedChars
是已知的列表,AdditionalDisallowedChars
来自运行时配置,可在推送配置后更改
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("a\u2029\u0000").matches());
}
我知道我每次都可以创建一个新的模式,但据我所知,这很昂贵,所以我想知道是否有更好的方法来检查额外的不允许列表。最好使用正则表达式,因为它很干净,但也欢迎其他有效的方法如果您将
禁用字符
的格式从正则表达式模式字符串更改为一个字符串,您可以将禁用字符
和附加禁用字符
连接起来,并用“[^”和“]+”结尾就像原始的正则表达式字符串一样,然后编译并使用它
public static final String disallowedChars = "\u2028\u2029\u0000-\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("a\u2029\u0000").matches());
}
public static String GetAdditionalDisallowedChars() {
return "..."; // read from config
}
一些额外的反馈项
disallowedChars
字符串包含多个空格。我不确定是否要排除空格,但字符之间不需要空格。在我的代码中,我删除了所有空格。如果你需要的话,再加一个
additionalDisallowedChars
变量名中的拼写错误
看起来您想检查字符串是否包含一些字符。我建议使用
String::contains
。您的问题并发布附加和禁用字符的示例值
。当您处理非标准ASCII字符时,我建议您自己使用可能的代码点,而不是依赖正则表达式来简单地检查字符是否允许,并维护一个数组/不需要的代码点的int值列表以进行检查反对。代码点的好处是,无论字符的实际编码如何,都有一个单独的值来表示该字符,而对于基于简单char
的字符,您可能会得到一个额外的代理字符,而正则表达式可能无法正确涵盖该字符。请注意,Java中的字符串在内部是基于UTF-16的。为了处理字符类中的特殊字符,例如-
,我将对每个字符进行转义:公共静态最终字符串regex=“[^”+String.join”(|)”,(disallowedChars+additionalDisallowedChars)。split(“”)+“]+”代码>(未测试!)