首页 > 解决方案 > 如何使正则表达式在找到每个匹配项时不消耗文本?

问题描述

我需要检测内容中的四字密码短语,它们是 n 到 m 个单词之间的序列。必须检测所有四个单词的序列,即使是部分重叠的序列,这是我的问题,因为我只知道如何编写一个消耗四个单词的序列,然后从该序列的末尾开始移动到下一个福特序列.

例如,如果我有序列:

随机正确的马电池钉书虫锡帽

我使用:

([A-Za-z0-9]+ ){4}([A-Za-z0-9]+)

它只会找到:

但我实际上需要找到以下所有内容:

所以提供的字符串中的所有四个单词序列。

我知道我的问题是我的正则表达式在找到第一个匹配项时会消耗前四个单词。

任何人都可以解释如何制作一个只“使用”第一个单词的正则表达式,然后给我从第二个单词开始的下一个有效序列,依此类推?

谢谢!

标签: regex

解决方案


不能仅使用正则表达式来完成,因为返回的输入已被消耗。

拆分字符串并使用标记,例如

List<String> words = Arrays.asList(sentence.split(" "));
List<List<String>> fourGrams = new ArrayList<>();
for (int i = 0; i < array.length - 4; i++) {
    fourGrams.add(words.subList(i, i + 4));
}

推荐阅读