使用java正则删除重复单词
正则表达式非常适合处理文本,文本我们使用正则删除重复单词,这时很常见的任务。
正则匹配后续的
java通过正则删除重复单词不是很复杂,但第一次写很可能出错:
String regex = "\\b(\\w+)(\\s+\\1\\b)+";
完整解释如下:
- \b: 查找单词边界 (仅匹配单词开始位置,而不是单词的中间位置);
- (\w+): 匹配一个或多个字符并记住作为组,供后面使用数字去引用;即匹配一个完整单词并记住。
- \s+: 匹配一个或多个空白字符;
- \1: 匹配在第二步中查找的单词;
- \b: 和第一步一样,确保不是匹配单词的一部分;
- (\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