正则表达式是个极端强大工具,提供了更强大的字符串处理能力,而且在字符串模式-匹配和字符串模式-替换方面富有弹性。Java JDK自 1.40版本就自带了支持正则表达式的包java.util.regex。在regex包中包括了两个类:Pattern(模式类)和Matcher(匹配器类)。Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。另加一个新的例外类,PatternSyntaxException,当遇到不合法的搜索模式时,会抛出例外
(1)Pattern类和Matcher类
Pattern类的实例表示以字符串形式指定的正则表达式(正则表达式是以字符串的形式给出来的,但就其本身来说并不是字符串,因为他有语法),其语法类似于Perl所用的语法。
用字符串形式指定的正则表达式,必须先编译成Pattern类的实例。生成的模式用于创建Matcher对象,它根据正则表达式与任意字符序列进行匹配。多个匹配器可以共享一个模式,因为它是非专属的。
用compile方法把给定的正则表达式编译成模式,然后用matcher方法创建一个匹配器,这个匹配器将根据此模式对给定的输入串进行匹配。pattern 方法可返回编译这个模式所用的正则表达式。
String str="aaabc efg ABC"; //待处理的字符串
String regEx="aaa|fff"; //指定正则表达式
Pattern p=Pattern.compile(regEx);//编译成模式
Matcher m=p.matcher(str);//创建一个匹配器
if( m.matches()){
.... .....
}
匹配器创建之后,就可以用它来执行三类不同的匹配操作:
matches方法根据此模式,对整个输入序列进行匹配。
lookingAt方法根据此模式,从开始处对输入序列进 行匹配。
find方法扫描输入序列,寻找下一个与模式匹配的地方。
这些方法都会返回一个表示成功或失败的布尔值。如果匹配成功,通过查询匹配器的状态,可以获得更多的信息。
(2)java构建正则表达式字符串的语法
正则表达式的语法要素有以下这些:常规字符,字符类(字符集合),通配符,量词,边界匹配符,运算符,组,标志序列
\d 等於 [0-9] 数字
\D 等於 [^0-9] 非数字
\s 等於 [ \t\n\x0B\f\r] 空白字符
\S 等於 [^ \t\n\x0B\f\r] 非空白字符
\w 等於 [a-zA-Z_0-9] 数字或是英文字
\W 等於 [^a-zA-Z_0-9] 非数字与英文字
$ 表示每行的结尾
. 匹配所有字符,包括空格、Tab字符甚至换行符
| 或 []方括号只允许匹配单个字符
^ 符号称为否符号。如果用在方括号内,表示不想要匹配的字符。 表示每行的开头
( ) 形成一个组合类型。如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜
线符 (\)将它转义为普通含义,否则被视为政治表达式中的特殊字符。
\b元字符是用来说明匹配单词的边界,它可以是空格或任何一种不同的标点符号(包括逗号,
句号等)。
+ 匹配1次或多次
* 匹配0次或多次
? 匹配0次或1次
eg:
String bad = "\\b(\\w+)\\s+\\1\\b";
\b:是单词的边界符,\1:。向后扫描的次数;该表达式匹配的是:它有一个或多个空格符,后面还跟有一个与此相同的单词
(3)对字符串的处理
Pattern类中预定义了许多静态标志,来进步一规范表达式。
不区分大小写的替换(符合reg中定义的字符串用***替换)
Matcher m = Pattern.compile(reg, Pattern.CASE_INSENSITIVE).matcher(str)
if(m.find()){
System.out.println(m.replaceAll("***"));
}
(4)java中使用正则表达式的方法
在String中有四个方法可以使用正则表达式,它们是matches、split、replaceAll和replaceFirst。
String bad = "\\b(\\w+)\\s+\\1\\b";
String[] str = {"Paris in the the spring","TJnndde","SHnnDde"};
for(String s : str){
System.out.println(s.replaceAll(bad, "*"));
}