Проблема с escape-последовательностями в регулярных выражениях Java, введенными как литералы, заключается в том, что они интерпретируются дважды:
- Во-первых, компилятор Java интерпретирует каждую escape-последовательность как часть синтаксического анализа строковых литералов,
- Во-вторых, движок Java Regex интерпретирует оставшиеся escape-последовательности как часть подготовки шаблона к сопоставлению
Важным следствием этого является то, что вы должны экранировать каждую косую черту в выражении, чтобы оно могло сделать егоот этапа компиляции Java до этапа компиляции regex:
Pattern REGEX = Pattern.compile("^([a-z]*|\\*)\\.([a-z]*)\\.([a-z]*)");
Возможно, это не самое читаемое решение, поэтому другой альтернативой будет использование классов символов вместо экранированных одиночных символов:
Pattern REGEX = Pattern.compile("^([a-z]*|[*])[.]([a-z]*)[.]([a-z]*)");