学习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正则表达式详细说明。由于作者之前对正则一知半解,现在进行系统学习,所以上述文章若有错误之处,请各位同学及时指出,共同学习进步。