在编程过程中,我们经常需要围绕字符串展开一些处理,如搜索子串,验证,替换文本等操作,而正则表达式恰好为我们做这些处理进行了大大的简化,而本文将介绍如何使用正则表达式在java中进行字符串的处理。
通常来讲,进行正则表达式操作需要这么两个步骤。
创建java.util.regex. Pattern对象。方法如下:
Pattern pattern=Pattern.compile(String matStr)
其中matStr是正则表达式,返回的结果patter为编译之后的正则表达式。
创建java.util.regex. Matcher对象。方法如下
Matcher matcher=pattern.matcher(String str)
其中str是进行搜索的字符串,返回的Matcher对象可以对分析结果进行解析。
下面用一个简单的例子来看一下:在这个例子中我们将查询字符串中的字串,并且用^将查询结果表示出来:
/**
* 最基础的正则表达式处理
* 查找字符串中的子串
* str是搜索字符串
* matStr是正则表达式
*/
public void findSubString(String str,String matStr){
char[] cArr=str.toCharArray();
char[] cArrMat=new char[str.length()];
Pattern pattern=Pattern.compile(matStr);
Matcher matcher=pattern.matcher(str);
while(matcher.find()){
//System.out.println(matcher.start()+"--"+matcher.end());
for(int i=matcher.start();i<matcher.end();i++){
cArrMat[i]='^';
}
}
System.out.println("findSubString的执行结果:");
System.out.println(cArr);
System.out.println(cArrMat);
}
调用时:new Test().findSubString("hsshdhasoasdhasd", "h.s");结果如下:
findSubString
的执行结果
:
hsshdhasoasdhasd
^^^ ^^^ ^^^
结果是字符串中
h
开头
s
结尾且中间只有一个字符的子串被标示了出来。
通过上面的例子我们知道了如何在
java
中使用正则表达式,下面将给出一些常用的正则表达式字符集
定义字符集
[aeiou] 任意方括号之间的字符都可以进行匹配
[^aeiou] 表示除了方括号之间^右面的任意字符
[a-e] 封闭范围,表示从a到e之间的所有字符
[a-eA-F1-9] a到e,A到F,1到9的字符
&& 逻辑与 如[a-e&&[^aeiou]]a-e除了aeiou
| 逻辑或
[H|h][aeiou]d 以H或h开头,中间为aeiou,结尾为d
预定义字符
. 代表任意字符
/d 代表数字。即[0-9]
/D 非数字的任意字符[^0-9]
/s 任意空白字符
/S 任意非空白字符[^/s]
/w 大小写字母,数字,下划线[a-zA-Z_0-9]
/W [^/w]
匹配边界,比如查找非内嵌的单词
^ 指定起始行
在每一行的开始查找单词java
^java
$ 指定行的结束
在每一行的末尾查找单词java
java$
/b 单词的边界
查找h开始,d结尾的单词
//bh.d//b
/B 非单词的边界
/A 指定被搜索字符串的起始
为找到位于搜索字符串起始位置的单词The //AThe//b
/z 指定被搜索字符串的末尾
为了在字符串末尾找到后面是句号的单词good
//bgood//z
/Z 除了最后终止符以外的输入结尾
量词的使用
如何重复使用子串
+ 表示一个或多个
//d+ 任意整数序列
?只可能发生一次或者根本就不发生 //d+(//.//d+)? 小数2.25
* 出现零次或者更多次
//d+(//.//d*)? 2.
通过这些字符集,我们可以对字符串进行随心所欲的处理。
再举个简单的例子,对某个字符串进行验证:
/**
* 匹配验证整个字符串
*
*/
public void matchString(String str,String matStr){
Pattern pattern=Pattern.compile(matStr);
Matcher matcher=pattern.matcher(str);
System.out.println("matchString的执行结果:");
if(matcher.matches()){
System.out.println("验证成功!");
}else{
System.out.println("验证失败!");
}
}
下面我们要验证一下某个字符串是否是由小写字符组成的
new Test().matchString("ashdk", "[a-z]+");
从字符串中获取数字元素
public void easy(String str,String matStr){
Pattern pattern=Pattern.compile(matStr);
Matcher matcher=pattern.matcher(str);
System.out.println("easy的执行结果:");
while(matcher.find()){
System.out.println(matcher.group());
}
}
调用执行:new Test().easy("ad45sdas2.5sd45.a.2sdd","//d+(//.//d*)?");
或者按照我们自己的意愿对字符串进行分割:
/**
*切分字符串,按照空格,逗号,句号分割
*/
public void splitString(String str){
String matStr="//s+|//.//s*|//,//s*";
String[] tokens=str.split(matStr);
System.out.println("splitString的执行结果:");
for(int i=0;i<tokens.length;i++){
System.out.println(tokens[i]);
}
}
调用执行:new Test().splitString("asd sad,asd.asd adasd.");