Можно ли вычесть соответствующий символ в классе символов?
Документы Java содержат примеры классов символов с вычитанием:
[a-z&&[^bc]] - a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] - a through z, and not m through p: [a-lq-z](subtraction)
Я хочу написать шаблон, который соответствует двум парам символов слова, когда пары не совпадают:
1) "aaaa123" - should NOT match
2) "aabb123" - should match "aabb" part
3) "aa--123" - should NOT match
Я близок к успеху по следующей схеме:
([\w])\1([\w])\2
но, конечно, это не работает в случае 1, поэтому мне нужно вычесть совпадение первой группы. Но когда я пытаюсь сделать это:
Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^\\1]])\\2");
Я получаю исключение:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 17
([\w])\1([\w&&[^\1]])\2
^
at java.util.regex.Pattern.error(Pattern.java:1713)
Так что, похоже, он работает не с группами, а только с перечислением определенных символов. Следующий шаблон компилируется без проблем:
Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^a]])\\2");
Есть ли другой способ написать такой шаблон?