java - java中的正则表达式: find all _overlapping_ variants (ab)|(bc)|(de)|(f) in abcdef

标签 java regex

如果我在 java 中运行这个正则表达式,我将收到 {ab, de, f},但我想收到 {ab、bc、de、f}。我认为 bc 无法收到,因为 bc 与 ab 字母重叠。如何更改默认行为?

最佳答案

您可以尝试使用look-ahead零宽度的机制,因此它执行的每次测试都会将光标重置到执行测试之前的位置。

只需迭代字符之间的所有位置并检查其后是否存在与正则表达式匹配的子字符串。您可以将此子字符串放入捕获组中并稍后访问它。

String input = "abcdef";
Pattern p = Pattern.compile("(?=(ab)|(bc)|(de)|(f))");
Matcher m = p.matcher(input);
while (m.find()){
    for (int i=1; i<=m.groupCount(); i++){
        if (m.group(i)!=null) 
            System.out.println("group ("+i+") -> "+m.group(i));
    }
}

输出:

group (1) -> ab
group (2) -> bc
group (3) -> de
group (4) -> f

关于java - java中的正则表达式: find all _overlapping_ variants (ab)|(bc)|(de)|(f) in abcdef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28651182/

相关文章:

java - 为什么会发生这种无限循环?

java - 如何在 Spring MVC 中使用带有属性名称的 Spring @RequestMapping 注解

java - 无需注入(inject)即可获得 e4 服务

与 HAMR 配合使用的 Java 虚拟机版本?

javascript - 正则表达式中的未终止组

python - 使用正则表达式,如何查找仅包含大写或小写的字符串

java - 如何创建正则表达式以确保在 Java 中正确初始化数组?

Java 8 流 max() 函数参数类型 Comparator 与 Comparable

javascript - 电子邮件正则表达式验证 javascript

javascript - 不允许输入某些字符的 jQuery 方法