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表达式:现代编程的瑞士军刀
随着Java 8的推出,Lambda表达式成为了Java编程语言的一大亮点。本篇文章旨在深入探讨Lambda表达式在Java中的应用及其对现代编程实践的影响。文章首先概述Lambda表达式的基本概念和语法结构,随后通过实例分析其在函数式编程接口中的运用,最后讨论Lambda表达式如何优化代码的可读性和简洁性,以及它对Java未来发展方向的潜在影响。
|
1天前
|
Java 开发者
Java中的Lambda表达式与函数式接口
【6月更文挑战第28天】在现代的Java编程实践中,Lambda表达式和函数式接口已经成为提升代码简洁性和可读性的重要工具。本文将深入探讨Lambda表达式的基本概念、语法结构以及如何与函数式接口结合使用,旨在帮助开发者更好地理解和运用这一特性,以编写出更加优雅和高效的Java代码。
|
2天前
|
人工智能 Java 编译器
大头儿子和小头爸爸的战斗--java字符和字符串
大头儿子和小头爸爸的战斗--java字符和字符串
|
3天前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
8 2
|
3天前
|
Java 编译器 开发者
Java中的Lambda表达式及其应用
在现代Java编程中,Lambda表达式作为函数式编程的重要特性之一,极大地简化了代码的书写和理解。本文将深入探讨Lambda表达式的定义、语法结构以及在实际开发中的应用场景,帮助读者更好地理解和运用这一强大的编程工具。
|
4天前
|
Java API 开发者
探索Java中的Lambda表达式和函数式接口
【6月更文挑战第25天】在Java的世界里,Lambda表达式的引入标志着一种全新的编程范式——函数式编程。本文将通过深入解析Lambda表达式及其与函数式接口的结合使用,带领读者领略这一特性如何简化代码,提升开发效率。
|
20小时前
|
Java
Java中的Lambda表达式与函数式编程
【6月更文挑战第29天】在Java 8中引入的Lambda表达式,为Java语言带来了革命性的变化。它不仅简化了代码,还使得函数式编程范式在Java中的应用成为可能。本文将深入探讨Lambda表达式的概念、语法及其在Java中的应用,同时展示如何通过Lambda表达式实现函数式编程的核心概念,如不可变性、纯函数和高阶函数等。
|
2天前
|
Java API 数据处理
Java中的lambda表达式与Stream API:高效的函数式编程
Java中的lambda表达式与Stream API:高效的函数式编程
|
3天前
|
Java 数据处理 API
使用Java Lambda表达式高效去重:一种优雅的数据处理实践
使用Java Lambda表达式高效去重:一种优雅的数据处理实践
6 0
|
3天前
|
Java Python
【学习记录 time:】Java8 Lambda 表达式中的 forEach 如何提前终止?
【学习记录 time:】Java8 Lambda 表达式中的 forEach 如何提前终止?
5 0