学习JAVA正则表达式基本用法
1.什么是正则表达式?
通俗的讲,正则表达式是使用一定规则去描述字符串,通常使用正则表达式,我们可以快速的对字符串进行查找,替换等操作。
2.基本方法用法
package com.learn.regex.part1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest1 {
public static void main(String[] args) {
// 如何创建一个正则表达式
Pattern pattern = Pattern.compile("(\\d)");// \d代表数字,由于\为转义字符,所以如果需要表示\则要用\\
// pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
System.out.println(pattern.pattern());// 输出\d
Matcher matcher = pattern.matcher("123");
//System.out.println(matcher.matches());// false
// 上述表达式需要匹配的是一个数字,则待匹配字符串是"123",显然不符合条件
// 注:当且仅当整个区域序列匹配此匹配器的模式时才返回 true。 from:java doc
System.out.println(matcher.find());// true
//find操作是:尝试查找与该模式匹配的输入序列的下一个子序列。
//此时我们调用start,end,group可以获得匹配成功的相关信息
/*
* 输出结果为0
* java doc:第一个匹配字符的索引
* 原待匹配字符串是"123",调用find后,匹配成功,匹配字符是1,1对应的字符串索引为char[0],0
* */
System.out.println(matcher.start(1));
/*
* 输出结果为1
* java doc:组捕获的最后字符之后的偏移量;如果匹配成功但组本身没有任何匹配项,则返回 -1。
* 原待匹配字符串是"123",调用find后,匹配成功,匹配字符是1,1对应的下一个字符串索引为char[1],1
* */
System.out.println(matcher.end());
/*
* 输出结果为1
* java doc:以前匹配操作所匹配的字符串形式的子序列(可能为空)。
* 原待匹配字符串是"123",调用find后,匹配成功,匹配字符是1,由于find匹配成功后就立即结束,所以得到的group只有["1"].
* */
System.out.println(matcher.group());
//★★★★此时我们再次调用find,start,end,group,结果还会一样吗?★★★★
System.out.println(matcher.find());// true
System.out.println(matcher.start());// 1
System.out.println(matcher.end());// 2
System.out.println(matcher.group());// 2
// 结果和上述明显不一样,那是因为matcher匹配器没有重置,我们已经调用了一次find,查看源码可知,会有个"last"索引去记录上次匹配成功的字符对应的下一个索引值,此处为1,所以是从待匹配字符实质为"23"。
// 调用matcher.reset()即可重置匹配器
}
}
3.group方法,分组的深入学习
package com.learn.regex.part1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest2 {
public static void main(String[] args) {
// 深入group,group的意思:捕获组可以通过从左到右计算其开括号来编号,组零始终代表整个表达式
Pattern pattern = Pattern.compile("(\\d)(\\d)(\\d)");
Matcher matcher = pattern.matcher("123");
if (matcher.matches()) {// 注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.
/*
* 从上述可知:
* group 0代表整个表达式,所以是123
* group 1从左到右计算其开括号来编号,即为第一个(\\d),对应的匹配值为1,所以group 1 = 1 下面同上
* group 2 = 2
* group 3 = 3
* */
//所以我们可以用这种方式另类实现反向(开玩笑),此group用法在我们要对原字符串进行部分替换时有很大用处
System.out.println(matcher.group(3) + matcher.group(2) + matcher.group(1));
}
//ex1:将下述日期格式转换为08/12/2016
String strDate = "2016-12-08";
Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = p.matcher(strDate);
if(m.matches()) {
System.out.println(m.group(3) + "/" + m.group(2) + "/" + m.group(1));
}
}
}
4.总结:
本文由于属于个人备忘使用,所以没有对正则表达式的一些常规匹配等做说明。只对java正则表达式进行简单介绍,迟点会出javascript正则表达式详细说明。由于作者之前对正则一知半解,现在进行系统学习,所以上述文章若有错误之处,请各位同学及时指出,共同学习进步。