Java正则表达式 重复字符(串)问题

简介: 最近需要处理一些微博文本,需要去除一些重复的中文字串,前一段时间正好用正则表达式匹配来解决微博发布日期的识别问题,所以立马想到用正则表达式解决。

最近需要处理一些微博文本,需要去除一些重复的中文字串,前一段时间正好用正则表达式匹配来解决微博发布日期的识别问题,所以立马想到用正则表达式解决。

先说需求,例如 文本“[好][好][好][开心]”,找出这些字符串;

从最简单的开始,先解决中文的问题,网上找的方法是用字符编码,unicode中汉字的字符编码是\u4E00到\9FA5,所以单个汉字可以用"[\\u4E00-\\u4E00]"表示;

接着就可以开始构造特定模式的字符串了,我遇到的是上面提到的方括号中有单字或双字的模式,尝试结果表示为"(([\\[])([\\u4E00-\\u4E00]{1,2})([\\]]))",解释一下

1. "(\\[)"表示匹配"[";

2. "([\\u4E00-\\u4E00]{1,2})"表示单字或双字的字串;

3. "(\\])"表示匹配"]";

所以整个表示的就是"[汉字单字或双字]";

接着再加上这个字符串的重复次数,和第二个解释中的次数设置同理,尝试结果为"((\\[)([\\u4E00-\\u9FA5a-zA-Z]{1,3})(\\])){3,}",表示汉字,字母,数字构成的1到3长的字符串出现3次及以上的模式,举例如下:

Java程序

public static void main(String[] args) {
	String regex = "((\\[)([\\u4E00-\\u9FA5a-zA-Z]{1,3})(\\])){3,}";
	String input = "[好好好好][好][好][好][好][好][还][还][还][还][w]"
                       +"[W][2][1]FJISIFJOIESNIOHFK[P][C][C][C][C][1][2][3]" 
                       +"cvsdcvsdvcsvs[高兴][开心][尴尬][不开心][发]";
	Pattern pattern = Pattern.compile(regex);
	Matcher matcher = pattern.matcher(input);
		
	while (matcher.find()) 
               System.out.println(matcher.start() + " " + matcher.end() + " " 
                       + matcher.group() + " " + matcher.group(1) + " " + matcher.group(2) 
                       + " " + matcher.group(3) + " " + matcher.group(4));
}

运行结果:

6 39 [好][好][好][好][好][还][还][还][还][w][W] [W] [ W ]
62 77 [P][C][C][C][C] [C] [ C ]
99 119 [高兴][开心][尴尬][不开心][发] [发] [ 发 ]

基本实现了功能,后来想更进一步,想着如何做通用字符串,但深入思考感觉不可行啊,通用的话,就是多次出现的字符串本身无模式要求,也就是我们寻找重复多次的字符串时,任何字符串都可以满足要求,这样的组合就太多了,一个字要考虑重复次数,多个字也要考虑重复次数,这样模式限制就有点太泛化了。我的功能还未实现完全,就是要求方括号中是同样的字符串,但这里只能保证方括号中的为数字字母汉字的有限次组合,要验证找出的结果是否是同一段字符串,只能另写程序了(比如每读入一个字符就测试已读入的字符序列是否是未读入序列的开头,暂时只想到这个),按我正则表达式的思路似乎不可行。

还有几个正则表达式的概念需要清楚,组,重复次数控制,元字符,转义等。

写了短短几行程序,既让我感受到了正则表达式的强大,又感觉自己对正则表达式的理解不深(毕竟刚接触没多久),比如,正则表达式的适用场合,当我查找一个字符串时,我想到了正则表达式,却似乎忘了它最本质的功能-模式匹配,看来自己需要好好理清字符串查找与字符串匹配的含义了。

目录
相关文章
|
3天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【8月更文挑战第28天】Lambda表达式在Java 8中首次引入,它提供了一种简洁、灵活的方式来表示匿名函数。本文将介绍Lambda表达式的基本概念、语法和常见用法,并探讨如何利用Lambda表达式来简化Java代码,提高开发效率。无论你是新手还是有经验的Java开发者,本文都将帮助你更好地理解和应用Lambda表达式。
|
6天前
|
Java 程序员 API
解锁Java新纪元:Lambda表达式——让你的代码秒变高大上,函数式编程不再是梦!
【8月更文挑战第25天】Java 8 推出了革命性的 Lambda 表达式特性,这是一种匿名函数形式,支持任意数量参数及返回值,简化了代码编写。其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。例如,遍历集合可从使用匿名内部类变为简洁的 `names.forEach(name -> System.out.println(name))`。
28 0
|
1天前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
1天前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。
|
3天前
|
Java 开发者
Java 8新特性之Lambda表达式与函数式接口
【7月更文挑战第59天】本文将介绍Java 8中的一个重要新特性——Lambda表达式,以及与之密切相关的函数式接口。通过对比传统的匿名内部类,我们将探讨Lambda表达式的语法、使用方法和优势。同时,我们还将了解函数式接口的定义和用途,以及如何将Lambda表达式应用于函数式编程。
|
5天前
|
Java API
探索Java中的Lambda表达式
【8月更文挑战第26天】本文将深入探讨Java 8引入的Lambda表达式,它如何简化代码并提升效率。通过实例展示其用法,帮助理解这一强大功能。
|
15天前
|
Java 开发者
Java中的Lambda表达式:简化你的代码之旅
【8月更文挑战第17天】 在编程的海洋中,简洁是航行的风帆。Lambda表达式,作为Java 8的一大亮点,为开发者提供了一种更为紧凑、易读的编码方式。本篇文章将带你领略Lambda表达式的魅力,从基础概念到实际应用,让你的代码像诗句一样流畅。
34 4
|
19天前
|
Java
Java——编码GBK的不可映射字符
Java——编码GBK的不可映射字符
23 1
下一篇
云函数