获取Java中所有出现的bigrams

时间:2019-06-24 04:33:27

标签: java regex

我正在尝试从字符串中排除所有出现的双字。

所以下面我有一些代码可以做到这一点。

String testString = "Lorem ipsum dolor sit amet.";

Pattern pat = Pattern.compile("\\w+ \\w+");
Matcher mat = pat.matcher(testString);

while (mat.find()) {
    System.out.println("Match: " + mat.group());
}

我得到的是:

匹配:Lorem ipsum

匹配:多洛尔坐下

我想要的结果是:

匹配:Lorem ipsum

匹配:ipsum dolor

匹配:多洛尔坐下

匹配:坐得住

2 个答案:

答案 0 :(得分:1)

仅匹配每个单词,而不匹配两个单词的每个组合。 然后保留最后一个单词,每当找到一个新单词时,都存储一个doublet。

String testString = "Lorem ipsum dolor sit amet.";

Pattern pattern = Pattern.compile("\\w+");
Matcher matcher = pattern .matcher(testString);
String lastSingleWord = null;
List<String> results = new ArrayList<>();

while (matcher.find()) {
    String singleWord = matcher.group(0);
    if (lastSingleWord != null) {
        results.add(lastSingleWord + " " + singleWord);
    }
    lastSingleWord = singleWord;
}

然后,如果需要,可以输出列表,也可以根据需要进行处理。

results.stream().forEach(System.out::println);
// Lorem ipsum
// ipsum dolor
// dolor sit
// sit amet

答案 1 :(得分:1)

尝试此模式(?<= |^)(?=([^ ]+ [^ ]+))

说明:

(?<= |^)-向后看,断言前面是空格还是字符串^

(?=([^ ]+ [^ ]+))-正向前进,断言以下内容是:[^ ]+除空格以外的一个或多个字符,空格,以及空格以外的一个或多个字符

Demo.

如评论中所建议,此模式可以稍微简化:(?=\b([^ ]+ [^ ]+))

Another demo.