是否可以减去字符类中匹配的字符?
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)
有没有其他方法来编写这样的模式?
使用
Pattern p = Pattern.compile("((\\w)\\2(?!\\2))((\\w)\\4)");
Run Code Online (Sandbox Code Playgroud)
您的角色将分组1和3。
这是通过使用负向前查找来实现的,以确保第一个字符组中第二个字符后面的字符是不同的字符。
| 归档时间: |
|
| 查看次数: |
1490 次 |
| 最近记录: |