/ / PatternSyntaxException w Javie (zgodna ścieżka rejestru Windows) - java, regex

PatternSyntaxException w Javie (pasujące do ścieżki rejestru systemu Windows) - java, regex

Mam metodę, która wygląda następująco, a kiedy próbuję ją uruchomić, dostaję wyjątek.

java.util.regex.PatternSyntaxException: Nieoczekiwany błąd wewnętrzny w pobliżu indeksu 6 ^ HKLM

Każdy, kto jest w stanie wykryć, co jest nie tak z moim wyrażeniem regularnym? Próbuję sprawdzić, czy ciąg znaków jest ścieżką rejestru systemu Windows i czy jest obsługiwany przez moje oprogramowanie.

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

Odpowiedzi:

4 dla odpowiedzi № 1

Znak odwrotnego ukośnika jest reprezentowany przez \ postać. Reprezentacja tego w wyrażeniu regularnym wymaga ucieczki każdej postaci, produkując \\.

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

4 dla odpowiedzi nr 2

Zwykle do reprezentowania dosłownie w wyrażeniach regularnych musisz raz uciec od tego \.

Ale w Javie musisz także uniknąć specjalnego znaczenia w ciąg. Więc będziesz musiał użyć "\\" produkować \ literał, który zostanie użyty w wyrażeniu regularnym w celu dopasowania dosłowny.

Proste, prawda? :)