[改善Java代码]推荐在复杂字符串操作中使用正则表达式
一、分析
字符串的操作,诸如追加、合并、替换、倒序、分隔等,都是在编码过程中经常用到的,而且Java也提供了append、replace、reverse、split等方法来完成这些操作,它们使用起来确实方便,但是更多的时候,需要使用正则表达式来完成复杂的处理。
二、场景
统计一篇文章中的单词的数量,代码如下:
import java.util.Scanner; public class Client {
public static void main(String[] args) {
//接收键盘输入
Scanner input = new Scanner(System.in);
while(input.hasNext()){
String str = input.nextLine();
//使用split方法分隔后统计
int wordsCount = str.split(" ").length;
System.out.println(str + " 单词数:" + wordsCount);
}
}
}
使用split方法根据空格来分隔单词,然后计算分隔后的数组长度,这种方法可靠吗?我们看输出:
Today is Monday Today is Monday 单词数:3 Today is Monday Today is Monday 单词数:4 Today is Monday?No! Today is Monday?No! 单词数:3 I'm Ok. I'm Ok. 单词数:2
注意到,除了第一个正确外,其它的都是错误的。第二条输入单词"Monday"前有两个空格,第三条输入中"NO"单词的前后没有空格,最后一个输入则没有把连写符号“'”考虑进去,这样统计出来的单词数量肯定错误一堆,那怎样才合理呢?
可以考虑使用正则表达式,代码如下:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Client {
public static void main(String[] args) {
//接收键盘输入
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
String str = input.nextLine();
//正则表达式对象
Pattern pattern = Pattern.compile("\\b\\w+\\b");//生成匹配器
Matcher matcher = pattern.matcher(str);
//记录单词数量
int wordsCount = 0;
//遍历查找匹配,统计单词数量
while (matcher.find()) {
System.out.println(matcher.group());
wordsCount++;
}
System.out.println(str + " 单词数:" + wordsCount);
}
}
}
输出结果:
Today is Monday 单词数:3
Today is Monday
Today is Monday 单词数:3
Today is Monday?No!
Today is Monday?No! 单词数:4
I'm Ok.
I'm Ok. 单词数:3
每项输出都是正确的,而且程序也不复杂,先生成一个正则表达式对象,然后使用匹配器进行匹配,之后通过一个while循环统计匹配的数量。
需要说明的是,在Java的正则表达式中"\b"表示的是一个单词的边界,它是一个位置界定符,一边为字符或数字,另外一边则非字符或数字.
例如"A"这样的一个输入就有两个边界,即单词"A"的左右位置,这也就说明了为什么要加上"\w"(它表示的是字符或数字)
三、建议
正则表达式在字符串的查找、替换、剪切、复制、删除等方面都有着非凡的作用,特别是面对大量的文本字符串需要处理(如果需要锤炼大量的LOG日志)时,使用正则表达式可以大幅提高开发效率和系统性能。
但是正则表达式是一个恶魔,它会使程序难以读懂。
//==================================
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Client {
public static void main(String[] args) {
String c = "But I'm not dead yet!";
Pattern pattern = Pattern.compile("[ [']]");
Matcher matcher = pattern.matcher(c);
for(String str:pattern.split(c)){
System.out.print(str+" ");
}
}
}
输出:
But I m not dead yet!
[改善Java代码]推荐在复杂字符串操作中使用正则表达式的更多相关文章
- 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式
一.分析 字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...
- [改善Java代码]推荐覆写toString方法
建议49: 推荐覆写toString方法 为什么要覆写toString方法,这个问题很简单,因为Java提供的默认toString方法不友好,打印出来看不懂,不覆写不行,看这样一段代码: public ...
- [改善Java代码]推荐使用String直接量赋值
建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...
- [改善Java代码]推荐使用枚举定义常量
枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...
- [改善Java代码] 推荐使用序列化实现对象的拷贝
建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
- 在java代码中显示json字符串(怎么避免json字符串中双引号在java代码中显示)
String log = "eyJvcmRlckluZm8iOnsiaWQiOjEwNzQwNCwib3JkZXJJZCI6MjczNjQyMSwicHJvZHVjdENvZGUiOjQ1N ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- [改善Java代码]对字符串排序 持一种宽容的心态
在Java中一涉及到中文处理就会冒出很多的问题来,其中的排序也是一个让人头疼的问题,看代码: import java.util.Arrays; public class Client { public ...
随机推荐
- php 判断图片类型
脚本之家 <?php $imgurl = "http://www.jb51.net/images/logo.gif"; //方法1 echo $ext = strrchr($ ...
- Red5下的room
http://blog.csdn.net/whycold/article/details/6142475 package com.test; import java.util.ArrayList;im ...
- iOS学习之自动布局
Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.pr ...
- JSF 2 password example
In JSF, you can use the <h:inputSecret /> tag to render a HTML input of type="password&qu ...
- VIM技巧(2)-删除匹配行
VIM技巧(2)-删除匹配行 代码如下: * @Company:中国股份有限公司 * @author ymzhao (也有zyyang的) * @Date: Jan 22, 2014 11:25:29 ...
- 解决Failed to execute goal org.apache.maven.plugins
1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile ...
- linux系统中如何查看日志 (常用命令)
cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关 ...
- Timus OJ 1997 Those are not the droids you're looking for (二分匹配)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1997 这个星球上有两种人,一种进酒吧至少玩a小时,另一种进酒吧最多玩b小时. 下面n行是 ...
- Navicat for mysql 11.0破解方法
Navicat for mysql破解器 首先下载破解器,然后解压至随意一个目录下.最后双击exe程序,按照提示找到你安装好的navicat for mysql文件夹下的navicat.exe程序,之 ...
- 有关java中static关键的重写问题
<Java编程思想>中这样提到“只有普通的方法调用可以是多态的”.说白了,就是静态方法不能实现重写这种多态. JAVA静态方法形式上可以重写(只要子类不加@Override关键字修饰的话, ...