模式:如何在字符类中减去匹配的字符?

Lai*_*jus 5 java regex

是否可以减去字符类中匹配的字符?

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)
Run Code Online (Sandbox Code Playgroud)

当对不相同时,我想写出匹配两对单词字符的模式:

1) "aaaa123" - should NOT match
2) "aabb123" - should match "aabb" part
3) "aa--123" - should NOT match
Run Code Online (Sandbox Code Playgroud)

我接近以下模式的成功:

([\w])\1([\w])\2
Run Code Online (Sandbox Code Playgroud)

但当然它在案例1中不起作用,所以我需要减去第一组的匹配.但是当我尝试这样做时:

Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^\\1]])\\2");
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

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)
Run Code Online (Sandbox Code Playgroud)

所以它似乎不适用于群组,而只是列出特定字符.以下模式编译没有问题:

Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^a]])\\2");
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来编写这样的模式?

fle*_*esk 3

使用

Pattern p = Pattern.compile("((\\w)\\2(?!\\2))((\\w)\\4)");
Run Code Online (Sandbox Code Playgroud)

您的角色将分组13

这是通过使用负向前查找来实现的,以确保第一个字符组中第二个字符后面的字符是不同的字符。