1

次のようなメソッドを取得しましたが、実行しようとすると例外が発生しました。

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;
        }
    }
4

2 に答える 2

4

バックスラッシュ文字は文字で表され\\ます。これを正規表現で表すには、各文字をエスケープして、を生成する必要があります\\\\

String SUPPRTED_REGISTRY_PATH_REGEX[] = new String[] {
   "^HKLM\\\\",
   "^HKEY_LOCAL_MACHINE\\\\",
   "^HKCR\\\\",
   "^HKEY_CLASSES_ROOT\\\\"
}
于 2013-03-26T15:17:06.317 に答える
4

通常\、正規表現でリテラルを表すには、一度エスケープする必要があります\\

\ただし、Javaでは、Stringの特別な意味をエスケープする必要もあります。したがって、リテラルと一致するように正規表現で使用されるリテラル"\\\\"を生成するためにを使用する必要があります。\\\

簡単じゃないですか:)

于 2013-03-26T15:21:05.180 に答える