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 № 1Znak 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? :)