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 [高兴][开心][尴尬][不开心][发] [发] [ 发 ]

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

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

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

目录
相关文章
|
28天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
14天前
|
XML 数据可视化 前端开发
java正则表达式
java正则表达式
|
2天前
|
并行计算 Java 编译器
Java Lambda表达式简介
Java Lambda表达式简介
9 0
|
4天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
7天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
11天前
|
Java
Java 14 强势登场:Switch 表达式的进化之路
Java 14 强势登场:Switch 表达式的进化之路
16 0
|
13天前
|
Java 开发者
Java中的Lambda表达式:简洁、灵活的编程利器
在现代软件开发中,编写简洁、高效的代码是至关重要的。Java中的Lambda表达式为开发者提供了一种简洁、灵活的编程方式,使得代码更具可读性和可维护性。本文将探讨Lambda表达式的基本概念、语法结构以及在实际项目中的应用,以帮助读者更好地理解和运用这一强大的编程工具。
6 0
|
14天前
|
存储 Java 数据库连接
java使用mp持久化框架,写入5000个字符,但是VARCHAR(255) 会报错
使用Java的MyBatis Plus框架时,如果尝试将超过VARCHAR(255)限制的字符串(如5000个字符)存入数据库,会抛出异常。解决方法是将列类型改为TEXT。可通过在实体类属性上添加`@TableField(typeHandler = JdbcType.CLOB)`注解,如`private String content;`,将属性映射到CLOB类型列,以存储更长字符串。
9 0
|
14天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
22天前
|
SQL Java 数据库连接
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
11 0

热门文章

最新文章