您的位置:首页 > 编程语言 > Java开发

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

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

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

从最简单的开始,先解决中文的问题,网上找的方法是用字符编码,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 [高兴][开心][尴尬][不开心][发] [发] [ 发 ]

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

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

写了短短几行程序,既让我感受到了正则表达式的强大,又感觉自己对正则表达式的理解不深(毕竟刚接触没多久),比如,正则表达式的适用场合,当我查找一个字符串时,我想到了正则表达式,却似乎忘了它最本质的功能-模式匹配,看来自己需要好好理清字符串查找与字符串匹配的含义了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式