java - 正则表达式拆分成重叠的字符串

标签 java regex split overlapping-matches

我正在探索正则表达式的力量,所以我只是想知道这样的事情是否可能:

public class StringSplit {
    public static void main(String args[]) {
        System.out.println(
            java.util.Arrays.deepToString(
                "12345".split(INSERT_REGEX_HERE)
            )
        ); // prints "[12, 23, 34, 45]"
    }
}

如果可能,则只需提供正则表达式(并先发制人地解释其工作原理)。

如果只有在 Java 以外的某些正则表达式风格中才有可能,那么也请随意提供。

如果不可能,请解释原因。


奖金问题

同样的问题,但使用 find() 循环而不是 split:

    Matcher m = Pattern.compile(BONUS_REGEX).matcher("12345");
    while (m.find()) {
        System.out.println(m.group());
    } // prints "12", "23", "34", "45"

请注意,与其说我有具体任务要以某种方式完成,不如说我想了解正则表达式。我不需要做我想做的代码;我想要正则表达式,如果它们存在,我可以在上面的代码中使用它们来完成任务(或者其他风格的正则表达式,可以将代码“直接翻译”成另一种语言)。

如果它们不存在,我想要一个很好的可靠解释。

最佳答案

我认为使用 split() 是不可能的,但是使用 find() 就很简单了。只需使用带有捕获组的前瞻:

Matcher m = Pattern.compile("(?=(\\d\\d)).").matcher("12345");
while (m.find())
{
  System.out.println(m.group(1));
}

许多人没有意识到在前瞻或后视中捕获的文本可以像任何其他捕获一样在匹配后被引用。在这种情况下,它尤其违反直觉,因为捕获是“整个”匹配的超集。

事实上,即使整个正则表达式都不匹配,它也能正常工作。从上面的正则表达式 ("(?=(\\d\\d))") 中删除点,您将得到相同的结果。这是因为,每当成功的匹配不消耗任何字符时,正则表达式引擎会自动向前移动一个位置,然后再尝试匹配,以防止无限循环。

不过,没有 split() 等同于此技术,至少在 Java 中没有。尽管您可以根据环视和其他零宽度断言进行拆分,但无法使同一字符出现在多个结果子字符串中。

关于java - 正则表达式拆分成重叠的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2437109/

相关文章:

c# - 为什么没有 string.Split(string) 重载?

java - ExpandableListView 单击时顺序发生变化

java.lang.NoSuchMethodError : javax. 验证.BootstrapConfiguration.getClockProviderClassName

javascript - 如何防止在输入字段中输入无效字符

Python RE(总之检查首字母区分大小写,其余字母不区分大小写)

python - 在 pandas 中分割时间戳日期

java - 如何在不复制对象的情况下将字符串转换为 char[]?

java - 在服务器上安装Solr : Location?

regex - 使用正则表达式查找替换匹配 URI

javascript - 将文本文件拆分为单独的数组元素