使⽤java正则删除重复单词
使⽤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 = Patternpile(regex, Pattern.CASE_INSENSITIVE);
循环替换
去重的第⼆步是循环替换,使⽤⼀个单词替换重复部分:
String input = "The the string String string stringing.";
Matcher m = p.matcher(input);
while (m.find()) {
input = up(), m.group(1));
}
它匹配上⾯定义的每个正则表达式的出现,并将整个字符串(这⾥是m.group())替换为第⼀个记住的组(m.group(1))的内容,后者是我们的单个单词。对上述输⼊字符串,m.group() 和 m.group(1) 将迭代两次,值分别为:
完整程序⽰例
package com.farenda.;
import Matcher;
import 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.
replaceall()Pattern p = Patternpile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
while (m.find()) {
input = up(), m.group(1));
}
System.out.println(input);
}
}
输出结果为:
The string stringing.
总结
本⽂通过java正在表达中分组功能实现删除重复单词。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。