Skip to main content
 首页 » 编程设计

使用java正则删除重复单词

2022年07月19日152Terrylee

使用java正则删除重复单词

正则表达式非常适合处理文本,文本我们使用正则删除重复单词,这时很常见的任务。

正则匹配后续的

java通过正则删除重复单词不是很复杂,但第一次写很可能出错:

String regex = "\\b(\\w+)(\\s+\\1\\b)+";

完整解释如下:

  1. \b: 查找单词边界 (仅匹配单词开始位置,而不是单词的中间位置);
  2. (\w+): 匹配一个或多个字符并记住作为组,供后面使用数字去引用;即匹配一个完整单词并记住。
  3. \s+: 匹配一个或多个空白字符;
  4. \1: 匹配在第二步中查找的单词;
  5. \b: 和第一步一样,确保不是匹配单词的一部分;
  6. (\s+\1\b)+:匹配一个或多个在第二步中查找的单词。

如果你想采用大小写不敏感方式匹配,仅需要使用CASE_INSENSITIVE标志编译上面正在表达式:

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

循环替换

去重的第二步是循环替换,使用一个单词替换重复部分:

String input = "The the string String string stringing."; 
Matcher m = p.matcher(input); 
while (m.find()) { 
    input = input.replaceAll(m.group(), m.group(1)); 
}

它匹配上面定义的每个正则表达式的出现,并将整个字符串(这里是m.group())替换为第一个记住的组(m.group(1))的内容,后者是我们的单个单词。对上述输入字符串,m.group() 和 m.group(1) 将迭代两次,值分别为:

  • m.group(): “The the” , m.group(1): ‘The’
  • m.group(): “string String string” , m.group(1): “string”.

完整程序示例

package com.farenda.java.util.regex; 
 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
 
public class Dedupper { 
 
    public static void main(String[] args) { 
        String input = "The the string String string stringing."; 
 
        String regex = "\\b(\\w+)(\\s+\\1\\b)+"; 
 
        // Use compile(regex) if you want case sensitive. 
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); 
 
        Matcher m = p.matcher(input); 
        while (m.find()) { 
            input = input.replaceAll(m.group(), m.group(1)); 
        } 
 
        System.out.println(input); 
    } 
}

输出结果为:

The string stringing.

总结

本文通过java正在表达中分组功能实现删除重复单词。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/82562706