java 正则表达式初习

        String r = "\\d{11}";          //匹配11位数字
        String regex = "20\\d\\d";     //匹配20开头的四位数字
        System.out.println("2015".matches(regex));        //true
        System.out.println("20154".matches(regex));    //false
        System.out.println("2115".matches(regex));          //false
        System.out.println("18436527894".matches(r));         //true
        System.out.println("s84365278945".matches(r));         //false
        String r2 = "a\\&c";       // \\&相当与\&即转义字符
        System.out.println("a&c".matches(r2));  //true
        //  . 表示可以匹配任何字符
        System.out.println("a b".matches("a.b"));   //true
        //\w可以匹配一个字母、数字或下划线
        System.out.println("ab_".matches("ab\\w"));// true
        System.out.println("ab5".matches("ab\\w")); //true
        System.out.println("abT".matches("ab\\w"));  //true
        //\s可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用\t表示)
        System.out.println("a c".matches("a\\sc"));  //  true
        System.out.println("a\tc".matches("a\\sc")); //true
        //用\d可以匹配一个数字,而\D则匹配一个非数字
        System.out.println("abc".matches("a\\Dc")); //true
        //类似的,\W可以匹配\w不能匹配的字符,\S可以匹配\s不能匹配的字符,这几个正好是反着来的。
        //修饰符*可以匹配任意个字符,包括0个字符
        System.out.println("abc".matches("a\\w*"));// true
        System.out.println("abc".matches("a\\d*"));// false
        System.out.println("a".matches("a\\w*")); //true
        //修饰符+可以匹配至少一个字符
        System.out.println("a".matches("a\\w+")); //false
        //修饰符?可以匹配0个或一个字符
        System.out.println("a".matches("a\\w?")); //true
        System.out.println("ab".matches("a\\w?")); //true
        System.out.println("abd".matches("a\\w?")); //false
        //如果我们想精确指定n个字符怎么办?用修饰符{n}就可以
        System.out.println("abs".matches("a\\w{2}")); //true
        /**请编写一个正则表达式匹配国内的电话号码规则:3~4位区号加7~8位电话,中间用-连接,例如:010-12345678。**/
        String re = "0\\d{2,3}-[1-9]\\d{6,7}?";
        System.out.println("010-12345678".matches(re)); //true
        //A{2,}	至少n个字符
        System.out.println("abdc".matches("a\\w{2,}")); //true
        //A{0,n}	最多n个字符
        System.out.println("anc".matches("a\\w{0,1}"));  //false
        //匹配开头和结尾,用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾。例如,^A\d{3}$,可以匹配"A001"、"A380"。
        System.out.println("abc124".matches("^\\w{3}\\d{3}$")); //true
        //使用[...]可以匹配范围内的字符,如下匹配1-9的数字
        System.out.println("0".matches("[123456789]")); //false
        System.out.println("0".matches("[1-9]")); //false
        System.out.println("abc".matches("a[a-t][b-t]")); //true
        //比如1A2b3c,我们可以这样写:[0-9a-fA-F]
        System.out.println("1aAeff".matches("[0-9a-fA-F]{6}"));//true
        //[...]还有一种排除法,即不包含指定范围的字符。
        System.out.println("abc".matches("[^1-9]{3}"));//true
        System.out.println("a0c".matches("[^1-9]{3}"));//true
        System.out.println("a2c".matches("[^1-9]{3}")); //true
        //用|连接的两个正则规则是或规则,例如,AB|CD表示可以匹配AB或CD
        String re1 = "java|php";
        System.out.println("java".matches(re1));//true
        System.out.println("php".matches(re1));//true
        System.out.println("go".matches(re1));//true
        //想要匹配字符串learn java、learn php和learn go,用(...)把子规则括起来表示成learn\\s(java|php|go)。
        

分组匹配

public class Main {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
        pattern.matcher("010-12345678").matches(); // true
        pattern.matcher("021-123456").matches(); // false
        pattern.matcher("022#1234567").matches(); // false
        // 获得Matcher对象:
        Matcher matcher = pattern.matcher("010-12345678");
        if (matcher.matches()) {
            String whole = matcher.group(0); // "010-12345678", 0表示匹配的整个字符串
            String area = matcher.group(1); // "010", 1表示匹配的第1个子串
            String tel = matcher.group(2); // "12345678", 2表示匹配的第2个子串
            System.out.println(area);
            System.out.println(tel);
        }
    }
}

要让\d+尽量少匹配,让0*尽量多匹配,我们就必须让\d+使用非贪婪匹配。在规则\d+后面加个?即可表示非贪婪匹配

public class Main {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(\\d+?)(0*)");
        Matcher matcher = pattern.matcher("1230000");
        if (matcher.matches()) {
            System.out.println("group1=" + matcher.group(1)); // "123"
            System.out.println("group2=" + matcher.group(2)); // "0000"
        }
    }
}

分割字符串:String.split()
搜索子串:Matcher.find()
替换字符串:String.replaceAll()

"a b c".split("\\s"); // { "a", "b", "c" }
"a b  c".split("\\s"); // { "a", "b", "", "c" }
"a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }

        String s = "the quick brown fox jumps over the lazy dog.";
        Pattern p = Pattern.compile("\\wo\\w");
        Matcher m = p.matcher(s);
        while (m.find()) {
            String sub = s.substring(m.start(), m.end());
            System.out.println(sub);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值