java - 模式 : how subtract matched character in character class?

标签 java regex

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

Java docs有关于带减法的字符类的例子:

[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");

还有其他方法可以写出这样的模式吗?

最佳答案

使用

Pattern p = Pattern.compile("((\\w)\\2(?!\\2))((\\w)\\4)");

您的角色将在 13 组中。

这通过使用否定前瞻来确保第一个字符组中第二个字符之后的字符是不同的字符。

关于java - 模式 : how subtract matched character in character class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174006/

相关文章:

JavaScript:转义符号后不匹配

java - OSGi:Apache Felix Maven 捆绑插件和 Javadoc

java - JAX-RS 授权获取更多数据

java - 如何从 vcard 中获取电话号码

c# - 从 Regex 读取捕获组也是 URL 重写规则?可能的?

c# - 正则表达式在 .NET 中查找标记值

python - 使用Python组合文件

c# - 从字符串中删除以 SOT 开头并以 EOT 结尾的子字符串

java - 在单元测试期间创建自定义 @TestScoped Guice 范围

java - 如何使用java中的身份验证方法连接Azure VM上的WASB