java提供了使用正则表达式的API----java.util.regex包。
该包下有常用的有2个类(Pattern、Matcher),其内部结构如图:
1. Pattern 类对正则表达式进行编译,Pattern对象就是正则表达式编译后的表达形式。、
2. Splitter 类(分离器),该类对目标字符串和正则表达式进行匹配,并按照正则表达式拆分目标字符串,该类拆分方法被Pattern对象调用。
3. PatternSyntaxException 类继承自非法参数异常,针对正则表达式的语法错误进行提示,getMessage()方法就是用来连接错误信息字符串的。
4. MatchResult 是一个接口,定义了七个方法,分别是: int end(); int end(int group); int start(); int start(int group); int groupCount(); String group(); String group(int group);
5. Matcher(匹配器) 类是将正则表达式和目标字符串进行匹配操作的引擎。
正则表达式的简单使用流程:
1. 创建Pattern对象, Pattern p = Pattern.compile("regex"); 传入正则表达式
2. 创建Matcher对象, Matcher m = p.matcher(CharSquence input); 传入目标字符串
3. 调用各种方法来对目标字符串进行匹配操作。例如: boolean b = m.matches(); 如果目标字符串和正则表达式互相匹配,返回true
各类方法详解:
1. Pattern类 (final修饰)
字段:
CASE_INSENSITIVE--忽略大小写 COMMENTS--忽略空白符 DOTALL--单行模式,此模式下 ”.“ 可以代表一切字符 MULTILINE--多行模式
构造方法:
构造方法是私有的,创建Pattern对象需要使用Pattern类提供的静态方法Pattern.compile(String regex); 传入正则表达式
此方还有一个重载方法compile(String regex, int flags); 第二个参数就是传入模式字段表示启动哪种模式。
常用方法:
int flags(); 返回当前模式字段
String pattern(); 返回当前正则表达式
Matcher matcher(CharSequence input); 生成一个Matcher对象,传入需要匹配的目标字符串
boolean matcher(String regex, CharSequence input); 静态方法,直接使用正则表达式去匹配目标字符串,匹配成功为true
String[] split(CharSequence input); 将目标字符串按照正则匹配的部分拆分(结果数组中不包含匹配的内容,即删除匹配的内容,将剩下的字符组成一个数组)
String[] split(CharSequence input, int limit); 第二个参数表示把目标字符串拆分成几段,如果指定limit小于使用一个参数的拆分方法拆分得到的数组长度,则此方法拆分的到的数组长度就是limit,即当拆分的段数等于limit时,后面的就不进行拆分了。如果limit的值是0,此方法作用和一个参数的拆分方法一样。
2. Splitter类(分离器)
Pattern中的split方法实际上最后还是调用了此类的spilt方法。
split(Pattern pattern, String regex, String input, int limit); 这几个参数的意义参考Pattern类的split方法。
3. PatternSyntaxException
这个异常继承自非法参数异常(IlleagalArgumentException),由Pattern类的compile方法抛出。用来检测正则表达式的语法错误。
调用getMessage()方法返回一个拼装好的错误信息字符串。
4. MatchResult
一个接口,
定义了七个方法,分别是: int end(); int end(int group); int start(); int start(int group); int groupCount(); String group(); String group(int group);
5. Matcher类
此类的构造方法也是私有的,创建该类对象需要使用Pattern对象的matcher()方法,传入需要匹配的目标字符串。
常用方法:
Matcher appendReplacement(StringBuffer sb, String replacement);
StringBuffer appendTail(StringBuffer sb);
int end();
int end(int group);
int start();
int start(int group);
String group();
String group(int group);
int groupCount();
boolean find();
boolean find(int start);
boolean lookingAt();
boolean matches();
Pattern patter();
String replaceAll(String replacement);
String replaceFirst(String replacement);
Matcher reset();
Matcher reset(CharSequence input);
其中,用于匹配器匹配字符串的方法有:
find();/find(int start); 此方法用于在目标字符串中查找
下一个
匹配的子串,找到返回true,重载方法里的参数代表从下标为start的位置开始向后寻找子串。
lookingAt(); 此方法用于确定目标串的
起始位置
是不是匹配正则表达式,是返回true。
matches(); 此方法对整个目标串进行匹配,如果满足返回true。
例:
这个匹配器如果调用m.matches()返回false,因为当前正则表达式只匹配[ab]其中的一个字符;如果调用m.lookingAt(),返回true,当前字符串起始位置就是[ab]中的一个;如果调用m.find()返回true,因为从下标为0的位置向后找,第一位就符合要求;
修改目标串,此时调用m.find(2)返回结果位false,因为从下标为2的地方开始向后寻找,找不到可以满足正则表达式的子串。
用于获得已匹配子串信息的方法:
start()/start(int group); 返回当前匹配串的 起点下标/返回当前匹配串指定组的 起点下标
end()/end(int group); 返回当前匹配串的 末尾下标/返回当前匹配串制定组的 末尾下标 注:
坐标为 [start, end)
group()/group(int group); 返回当前匹配串的所有内容/返回当前匹配串的指定组的所有内容
groupCount(); 返回当前匹配串的组的数量
这些获得子串信息的方法一般搭配find方法使用。打印信息为:
用于对匹配串进行操作的方法:
replaceAll(String replacement); 把目标串里面的所有匹配串都替换成该方法的参数
replaceFirst(String replacement); 把目标串里面的第一个匹配串替换成该方法的参数
appendReplacement(StringBuffer sb, String replacement); 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里
appendTail(StringBuffer sb);
将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里
例:
其他方法:
reset()/reset(
CharSequence input); 重置匹配器/重置匹配器,并将方法参数设置为目标串。 注:匹配器如果重置了,那么目标串也就重置了,如果使用无参的重置方法,那么重置后的目标串依旧是原来的目标串。
pattern(); 返回当前的Pattern对象
例:
在调用appendTail()方法之前重置匹配器,那么目标串刷新,结果为
如果调用该代码中有参的那个重置方法,结果为