5.6正则表达式
5.6.1元字符
正则表达式是由普通字符(如字符a -z)和特殊字符(元字符)组成的文字模式。元字符是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
常见的正则表达式元字符如表5-15所示。
元字符 | 功能描述 |
\ | 转义字符,例如"\n"匹配"\n" |
^ | 正则表达式的开头标志 |
$ | 正则表达式的结尾标志 |
* | 匹配零次或多次 |
+ | 匹配一次或多次 |
? | 匹配一次或零次 |
. | 匹配任意字符 |
{n} | 匹配n次 |
{n.} | 至少匹配n次 |
{n.m} | n<=m,最少匹配n次,最多匹配m次 |
x|y| | 匹配x或者y |
【xyz】 | 字符集合,匹配所包含的任意一个字符 |
【a-z】 | 字符范围,匹配指定范围内的任意字符 |
【^a-z】 | 负值字符范围,匹配任何不在指定范围内的任意字符 |
【a-zA-Z】 | 匹配a~z到A~Z |
【a-z】 | 字符范围,匹配指定范围内的任意字符 |
\d | 匹配数字1-9 |
\D | 匹配非数字字符 |
\s | 匹配空白字符 |
\S | 匹配非空白字符 |
\w | 匹配单词字符与数字0~9 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
\b | 单词边界 |
5.6.2 Pattern类和Matcher类
Java正则表达式通过java.util.regex包下的Pattern类和Matcher类实现,所以要想使用正则表达式,首先要学会这两个类的使用方法,下面分别对这两个类进行详细讲解。
1.Pattern类
Pattern类用于创建一个正则表达式,也可以说,创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式,具体代码如下:
Pattern p=Pattern.compile("\\w+");
Pattern在正则表达式的应用比较广泛,所以灵活使用Pattern类是非常重要的,下面介绍Pattern类的常用方法,如表5.16所示
方法声明 | 功能描述 |
split(CharSequence input) | 将给定的输入序列分成这个模式的匹配 |
Matcher matcher(CharSequence input) | 提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持 |
Static boolean matches (String regex,CharSequence input) | 翻译给定的正则表达式,并尝试匹配给定的输入 |
下面通过一个案例来学习Pattern类的常用方法
import java.util. regex .Matcher;
import java.util. regex. Pattern;
public class Example28 (
public static void main (String[] args) (
Pattern p=Pattern. compile ("\\d+") ;
String[] str-p.split (“我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa. com") ;
System.out.println ("是否匹配Pattern的输入模式"+
Pattern. matches ("\\d+", "2223") ) ;
System.out .println ("是否匹配Pattern的输入模式"+
Pattern. matches ("\\d+", "2223aa") ) ;
Matcher m=p. matcher ("22bb23") ;
System. out .println ("返回该Matcher对象是由哪个Pattern对象创建的,即p为: "+ m.pattern () ) ;
System. out .print ("将给定的字符串分割成Pattern模式匹配为: ") ;
}
}
}
运行结果→
是否匹配Pattern的输入模式true
是否匹配Pattern的输入模式false
返回该Matcher对象是由哪个Pattern对象创建的,即p为:\d+
将给定的字符串分割为Pattern模式匹配为:我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa. com
2.Matcher类
Matcher类用于在给定的Pattern实例的模式控制下进行字符串的匹配工作,同理,Matcher的构造方法也是私有的,不能直接创建,只能通过Pattern matcher(CharSequence input)方法得到该类的实例。下面介绍Matcher类的常用方法。
方法声明 | 功能描述 |
boolean Matches() | 对整个字符串进行匹配,只有整个字符串都匹配才返回true |
boolean lookingAt() | 对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true |
boolean find() | 对字符串进行匹配,匹配到的字符串可以在任何位置 |
int end() | 返回最后一个字符匹配后的偏移量 |
string group() | 返回匹配到的子字符串 |
int start() | 返回匹配到的子字符串在字符串中的索引位置 |
下面通过一个案例来学习Matcher类的常用方法。
import java.util. regex .Matcher;
import java.util . regex. Pattern;
public class Example29{
public static void main (String[l args) {
Pattern p-Pattern. compile ("\\d+") ;
Matcher m-p.matcher ("22bb23") ;
System. out.println ("字符串是否匹配:"十m.matches ( ) ;
Matcher m2-p.matcher ("2223") ;
System. out .println ("字符串是否匹配:"+ m2 .matches ( ) ;
System.out.printin("对前面的字符串匹配结果内"十m. lookingAt () ) ;Matcher m3-p .matcher ("aa2223") ;
System. out .println ("対前面的字符串匹配结果内: "+m3. lookingAt ( ) ;m.find();//返回true
System. out .println ("字符串任何位置是否匹配:"+ m.find () ) ;
m3.find () ;//返回true
System.out .println ("字符串任何位置是否匹配:"+ m3. find () ) ;Matcher m4=p .matcher ("aabb") ;
System.out.println ("字符串任何位置是否匹配:"+ m4.find () ) ;Matcher ml-p.matcher ("aaa2223bb") ;
m1.find ();//匹配2223
System.out println ("上一个匹配的起始索引:"+ m1.start () ) ;system.out.println ("最后一个字符匹配后的偏移量:"十ml.end () ) ;system.out.println ("匹配到的子字符串:"+ ml .group ()) ;
}
}
运行结果→
字符串是否匹配:false
字符串是否匹配: true
对前面的字符串匹配结果为: true
对前面的字符串匹配结果为:false
字符串任何位置是否匹配:false
字符串任何位置是否匹配:false
字符串任何位置是否匹配:false
上一个匹配的起始索引:3
最后一个字符匹配后的偏移量:7
匹配到的子字符串:2223
5.6.3 String类对正则表达式的支持
String类提供了3个方法支持正则操作。如图
方法声明 | 功能描述 |
boolean matches(String regex) | 匹配字符串 |
String replaceAll(String regex,String replaceAll) | 字符串替换 |
String[]split(String regex) | 字符串拆分 |
下面通过一个案例学习方法
public class Example30{
public static void main (String[] args){
String str= "A1B22DDS34DSJ9D". replaceA11 ("\\d+","_") ;
System. out .println ("字符替换后为: "+str) ;
booleante ="321123as1".matches("\\d+");
System. out.println("字符串是否匹配: "+te);
String s []="SDS45d4DD4dDS88D" .split ("\\d+");
System. out. print ("字符串拆分后为: ") ;
for (int i=0;i<s.length;i++){
System.out.print(s[i]+"");
}
}
}
运行结果→
字符替换后为: A_B_DDS_ DSJ_D
字符串是否匹配: false
字符串拆分后为: SDS d DD dDs D