相关的类都在 java.util.regex 之内, 一般来说, 主要用到的是这两个类:
- java.util.regex.Pattern
- java.util.regex.Matcher
Pattern 对应正则表达式, 一个 Pattern 与一个 String 对象关联, 生成一个 Matcher, 它对应 Pattern 在 String 中的一次匹配; 调用 Matcher 对象的 find()方法, Matcher 对象就会更新为下一次匹配的匹配信息示例:
- Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-]]d{2}");
- String string = "2010-12-20 2011-02-14";
- Matcher matcher = pattern.matcher(string);
- while(matcher.find()) {
- System.out.println(matcher.group(0));
- }
- Pattern
Pattern 是 Java 语言中的正则表达式对象要使用正则表达式, 首先必须从字符串编译出 Pattern 对象, 这需要用到 Pattern.compile(String regex)方法
Pattern pattern = Pattern.compile("a.b+");
如果要指定匹配模式, 可以在表达式中使用 (?modifier) 修饰符指定, 也可以使用预定义常量下面的两个 Pattern 对象的生成方法不同, 结果却是等价的
- Pattern pattern = Pattern.compile("(?i)a.b+");
- Pattern pattern = Pattern.compile("a.b+",Pattern.CASE_INSENSITIVE);
如果要同时指定多种模式, 可以连写模式修饰符, 也可以直接用 | 运算符将预定义常量连接起来, 以下两个 Pattern 对象也是等价的
- Pattern pattern = Pattern.compile("(?is)a.b+");
- Pattern pattern = Pattern.compile("a.b+",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
下面介绍 Pattern 的主要成员方法:
static boolean matches(String regex.CharSequence input)
这个方法可以检验字符串 input 能否由正则表达式 regex 匹配, 因为是静态方法, 所以不需要编译生成各个对象, 方便随手使用要注意的是, 它检验的是整个字符串能否由表达式匹配, 而不是表达式能否在字符串中找到匹配你可以认为 regex 的首尾自动加上了匹配字符串起始和结束位置的锚点 \A 和 \ z
- Pattern.matches("\d{6}","a123456"); //false
- Pattern.matches("\d{6}","123456"); //true
- String[] split(CharSequence text)
通常, Pattern 对象需要配合下面将要介绍的 Matcher 一起完成正则操作如果只用正则表达式来切分字符串, 只用 Pattern 的这个方法也可以
这个方法接收的参数类型是 CharSequence 它可能有点陌生, 其实它是 String 的父类, 其他子类还有 CharBuffer,StringBuffer,StringBuilder, 因而可以应对常见的各种表示字符串的类下面的代码仅以 String 为例:
- String s = "2010-12-20";
- Pattern pattern = Pattern.compile("\s+");
- for(String part : pattern.split(s)){
- System.out.println(part);
- }
- String[] split(CharSequence text,int limit)
这个方法与上面的方法很相似, 只是多了一个参数 limit, 它用来限定返回的 String 数组的最大长度也就是说, 它规定了字符串至多只能切 limit-1 次如果不需要对字符串比较大, 进行尽可能多的切分, 使用这个方法
- String s = "2010-12-20";
- Pattern pattern = Pattern.compile("\s+");
- for(String part : Pattern.split(s,2)){
- System.out.println(part);
- }
既然 limit 是一个 int 类型, 那么它自然可以设定为各种值, 下表总结了 limit 在各个取值区间对结果的影响(未指定 limit 时, 最终返回包含 n 个元素的数组, 实际能切分的次数是 n-1 ):
取值
结果
limit < 0
等于未设定 limit 时, 保留末尾的空字符串
limit = 0
等于未设定 limit 时, 切分 n-1 次, 忽略末尾的空字符串
0 < limit < n
返回数组包含 limit 个元素, 切分 limit-1 次, 最后一个元素是第 limit-1 次切分后, 右侧剩下的所有文本
limit >= n
等于未指定 limit 时
static String quote(String text)
这个方法用来取消字符串 text 中所有转义字符的特殊含义, 实质就是在字符串首尾添加 \Q 和 \E 通常, 如果需要把某个字符串作为没有任何特殊意义的正则表达式(比如从外界读入的字符串, 用在某个复杂的正则表达式中), 就可以使用这个方法:
- "aacb".matches("a.b"); //true
- "a.b".matches("a.b"); //false
- "a.b".matches("a.b"); //false
- "a.b".matches(Pattern.quote("a*.b")); //true
- Matcher
Matcher 可以理解为某次具体匹配的结果对象: 把编译好的 Pattern 对象应用到某个 String 对象上, 就获得了作为本次匹配结果的 Matcher 对象之后, 就可以通过它获得关于匹配的信息
- Pattern pattern = Pattern.compile("\d{4}-\d{2}-\d{2}");
- Matcher matcher = pattern.matcher("2010-12-20 2011-02-14");
- while(matcher.find()){
- System.out.println(matcher.group());
- }
对编译好的 Pattern 对象调用 matcher(String text)方法, 传入要匹配的字符串 text, 就得到了 Matcher 对象, 每次调用一次 find()方法, 如果返回 true, 就表示找到一个匹配, 此时可以通过下面的若干方法获得关于本次匹配的信息
String group(int n)
返回当前匹配中第 n 对捕获括号捕获的文本, 如果 n 为 0, 则取匹配的全部内容; 如果 n 小于 0 或者大于最大分组编号数, 则报错
String group()
返回当前匹配的全部文本, 相当于 group(0)
int groupCount()
返回此 Matcher 对应 Pattern 对象中包含的捕获分组数目, 编号为 0 的默认分组不计在内
int start(n)
返回当前匹配中第 n 对捕获括号匹配的文本在原字符串中的起始位置
int start()
返回当前匹配的文本在原字符串中的起始位置, 相当于 start(0)
int end(n)
返回当前匹配中第 n 对捕获括号匹配的文本在原字符串中的结束位置
int end()
返回当前匹配的文本在原字符串中的结果位置, 相当于 end(0)
String replaceAll(String replacement)
如果进行正则表达式替换, 一般用到的是 Matcher 的 replaceAll()方法, 它会将原有文本中正则表达式能匹配的所有文本替换为 replaceement 字符串
String
许多时候只需要临时使用某个正则表达式, 而不需要重复使用, 这时候每次都生成 Pattern 对象和 Matcher 对象再操作显得很烦琐所以, Java 的 String 类提供了正则表达式操作的静态成员方法, 只需要 String 对象就可以执行正则表达式操作
boolean matches(String regex)
这个方法判断当前的 string 对象能否由正则表达式 regex 匹配请注意, 这里的匹配指的并不是 regex 能否在 String 内找到匹配, 而是指 regex 匹配整个 String 对象, 因此非常适合用来做数据校验
- "123456".matches("\d{6}"); //true
- "a123456".matches("\d{6}"); //true
- String replaceFirst(String regex,String replacement)
这个方法用来替换正则表达式 regex 在字符串中第一次能匹配的文本, 可以在 replacement 字符串中用 $num 引用 regex 中对应捕获分组匹配的文本
- "2010-12-20 2011-02-14".replaceFirst("(\d{4})-(\d{2})-(\d{2})","$2/$3/$1");
- String replaceAll(String regex,String replacement)
这个方法用来进行所有的替换, 它的结果等同于 Matcher 类的 replaceAll()方法, replacement 字符串中也可以用 $num 的表示法引用 regex 中对应捕获分组匹配的文本
- "2010-12-20 2011-02-14".replaceAll("(\d{4})-(\d{2})-(\d{2})","$2/$3/$1");
- String[] split(String regex)
这个方法等价于 Pattern 中对应的 split()方法, 此处不再赘述
String[] split(String regex,int limit)
这个方法等价于 Pattern 中对应的 split()方法, 此处不再赘述
来源: http://www.jianshu.com/p/c4802046d5f5