关于java正则表达式中的 ^和$的使用

java正则表达式的边界匹配符中,有两个比较常用的字符:“ ^ ”和“ $ ”,这两个字符理解起来比较容易混淆。先说下这两个字符的含义:
“ ^ ”:匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与”\n”或”\r”之后的位置匹配(即匹配每一行的开始);

“ $ ” :匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与”\n”或”\r”之前的位置匹配(即匹配每一行的结束)。

那很多初学的朋友,不理解这两个字符的用法,“^aa+$”和“aa+”在进行匹配的时候貌似没区别。我们结合代码来看,就容易理解了。
我们来看代码的最后一部分。
字符串a和b,字符串和匹配的正则表达式基本相同,只是b中有“^”字符。那我们看输出的字符串结果,不难发现,a中,将两个数字的部分,均替换成了“Z”,而b中只是将开头的两个数字替换成了“Z”,因为“^”的要求是从开始进行匹配。这样中间的两个数字就匹配不到了,也就没有替换。而没有“^”的a来说,只要满足是两个数字的情况,就可以进行匹配和替换,不会区分是否是从字符串的开始进行匹配。同理,“$”判定是从最后面开始匹配,可结合c和d的结果,类比理解。
值得一提的一点是,不管是带有“ ^”和 ” \$” 的正则表达式,在进行matches方法匹配的时候,均返回false。因为matches()匹配的是整个字符串,而不是某一部分,很明显文中使用的正则表达式并不能完全匹配输入的字符串,所以返回值均为false。

public class RegexDemo {

    public static void main(String[] args) {
        //匹配邮箱
        String regex="^.+@.+(\\..+){1,}$";
        String str="fushb@163.com";
//      System.out.println(str.matches(regex));

        //匹配固定电话  4位区号-7位号码 或者 3位区号-8位号码
        String regex2="^\\d{4}-\\d{7}|\\d{3}-\\d{8}$";
        String str2="020-13222113";
        String str3="0532-9989211";
//      System.out.println(str2.matches(regex2));
//      System.out.println(str3.matches(regex2));

        //匹配除了a和9之外的数字或字符
        String regex3="^[^9a]{1,}$";
        String str4="1234fsfse";
        String str5="a2343";
//      System.out.println(str4.matches(regex3));
//      System.out.println(str5.matches(regex3));

        //^和$的用法
        String a = "3131sasfasd".replaceAll("\\d{2}", "Z");
        String b = "3131sasfasd".replaceAll("^\\d{2}", "Z");//仅替换字符串开头的两个数字
        String c = "3131sdasfasd".replaceAll("sd", "Z");
        String d = "3131sdsfasd".replaceAll("sd$", "Z");//仅替换字符串开头的两个数字
        System.out.println(a);//ZZZsasfasd
        System.out.println(b);//Z3131sasfasd
        System.out.println(c);//aa3131ZasfaZ
        System.out.println(d);//aa3131sdsfaZ
        String str6 = "aa3131sasfasd";
        System.out.println(str6.matches("\\d{2}")); //false
        System.out.println(str6.matches("^\\d{2}"));//false
    }

}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值