Java中的PatternSyntaxException(匹配Windows注册表路径)

时间:2013-03-26 15:13:41

标签: java regex

我有一个看起来如下的方法,当我尝试运行它时,我得到了一个例外。

java.util.regex.PatternSyntaxException:索引6附近出现意外的内部错误 ^ HKLM \

任何人都能发现我的正则表达式出了什么问题?我要做的是检查一个Windows注册表路径的字符串,并确保我的软件支持它。

    final String SUPPRTED_REGISTRY_PATH_REGEX[] = new String[] {
        "^HKLM\\",
        "^HKEY_LOCAL_MACHINE\\",
        "^HKCR\\",
        "^HKEY_CLASSES_ROOT\\"
    };

    boolean isValidated = false;

    // Windows registry path is case-insensitive therefore
    // convert the registry path to all upper case for
    // ease of comparison
    String uppercaseRegistryPath = registryPath.toUpperCase(); 

    for(int i = 0;
        i < SUPPRTED_REGISTRY_PATH_REGEX.length && isValidated == false;
        i++) {

        if(Pattern.matches(
                SUPPRTED_REGISTRY_PATH_REGEX[i], uppercaseRegistryPath)) {
            isValidated = true;
        }
    }

2 个答案:

答案 0 :(得分:4)

反斜杠字符由\\字符表示。要在正则表达式中表示这一点,需要对每个字符进行转义,从而生成\\\\

String SUPPRTED_REGISTRY_PATH_REGEX[] = new String[] {
   "^HKLM\\\\",
   "^HKEY_LOCAL_MACHINE\\\\",
   "^HKCR\\\\",
   "^HKEY_CLASSES_ROOT\\\\"
}

答案 1 :(得分:4)

通常要在正则表达式中表示\字面值,您需要在\\时将其转义一次。

但是在Java中你还需要在String中逃避\的特殊含义。因此,您必须使用"\\\\"生成\\字面值,该字面值将在正则表达式中用于匹配\字面值。

简单不是它:)