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(“”)+“]+”(未测试!)