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
}
}