1.用正则表达式心里得有两个东西的概念。第一是字符串(String),即正则表示式合作的对象。第二,正则,即需要根据规则,写一个符合条件的正则。
2.查看API
3.字符类(Character classes)
(1)[ab] :有两个条件,第一是字符串中有满足a或b的字符,第二是字符串只能是一个字符
String regex="[abc]"; String a="a"; String a1="b"; String a2="abc"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); // true true false
(2)[^ab]:有两个条件,第一是含有除了a,b之外的字符,第二是字符串只能是一个字符
String regex="[^abc]"; String a="dd"; String a1="d"; String a2="b"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
(3)[A-Z]:有两个条件,第一是字符串只能是一个字符,第二是大写字母A-Z中的一个
String regex="[A-Z]"; String a="GG"; String a1="D"; String a2="3"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
[a-z]:有两个条件,第一是字符串只能是一个字符,第二是小写字母a-z中的一个
String regex="[a-z]"; String a="dd"; String a1="d"; String a2="A"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
String regex="[a-zA-Z]"; String a="a"; String a1="D"; String a2="A"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
String regex="[A-Za-z]"; String a="a"; String a1="D"; String a2="A"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
String regex="[A-z]"; String a="a"; String a1="D"; String a2="A"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
String regex="[a-f]"; String a="a"; String a1="B"; String a2="g"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true false false
String regex="[a-fh-m]"; String a="a"; String a1="l"; String a2="g"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
String regex="[a-fk]"; String a="a"; String a1="l"; String a2="k"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true false true
(4)[A-Z[a-z]]:第一总的输出结果还是只能是一个字符,第二该字符串可以是A-Z或者a-z的任意一个字符
String regex="[a-f[h-m]]"; String a="a"; String a1="l"; String a2="g"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
(5)[ab&&b]:第一是字符串只能是一个字符,第二该结果是&&两边的交集。
String regex="[acb&&bc]"; String a="a"; String a1="b"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true true
这个复杂的问题可以画数轴线来判断
4.Predefined character classes(预定义字符类)
(1).(点):第一,表示任意字符,不是字面上的点(这样就不能用来判读只能有点的字符串了)(但是在[]里面点就只是字面量了)
第二,一个点表示一个字符。如果有两个点,那么字符串必须是两个
String regex="."; String a="."; String a1="b"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
String regex="[.d]"; String a="."; String a1="d"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
String regex=".."; String a="."; String a1="dd"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
(2)\.:表示符合.的字符串(在这里\只是一个字符的存在,但是在字符串里\是作为转义字符,我们需要的不是转义字符,所以写的时候需要两个\\)
String regex="\\."; String a="."; String a1="dd"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true false false
(3)\d:跟[0-9]相同
String regex="\\d"; String a="10"; String a1="4"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
(4)\D:跟[^0-9]相同(注意也只能是一个字符)
String regex="\\D"; String a="10"; String a1="4"; String a2="c"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false false true
(5)\s:表示一个字符;表示一个空字符;tab也是一个空白字符
String regex="\\s"; String a=""; String a1=" "; String a2=" ";//tab System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true true
(6)\S:跟[^\s]等价
String regex="\\S";
String a="s";
String a1=" ";
String a2="2";
System.out.print(a.matches(regex)+" ");
System.out.print(a1.matches(regex)+" ");
System.out.print(a2.matches(regex)+" ");
//true false true
(7)\w:等价于[a-zA-Z_0-9]
String regex="\\w"; String a="d"; String a1="_"; String a2="2"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
(8)\W:[^\w]
String regex="\\W"; String a="d"; String a1="_"; String a2="*"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
5.Greedy quantifiers(数量词)
(1)?:表示满足条件或者字符串为空
String regex="[ab]?"; String a=""; String a1="a"; String a2="d"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
(2)*:表示没有也可以,有也可以,有多个也可以
String regex="[ab]*"; String a=""; String a1="aa"; String a2="d"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
(3)+:一次或多次
String regex="[ab]+"; String a=""; String a1="aa"; String a2="d"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true false
(4){n}:就规定有n次(出现的字符只要满足要求,不规定必须出现的是同一个字符)
String regex="[ab]{3}"; String a="abb"; String a1="aaa"; String a2="aaab"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true false
(5){n,}:至少n次
String regex="[ab]{3,}"; String a="abb"; String a1="aaa"; String a2="aaab"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //true true true
(6){m,n}:包含m,n在内的次数范围
String regex="[ab]{3,4}"; String a="ab"; String a1="aaa"; String a2="aaab"; System.out.print(a.matches(regex)+" "); System.out.print(a1.matches(regex)+" "); System.out.print(a2.matches(regex)+" "); //false true true
6.拆分字符串
(1)根据空字符串拆分字符串
String a="my name is sun"; String [] arr=a.split(" "); for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } /* my name is sun */
(2)根据点来拆分
String a="my.name.is.sun"; String [] arr=a.split("\\."); for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } /* * my name is sun */
String a="my.name.is.sun"; String [] arr=a.split("."); for(int i=0;i<arr.length;i++) { System.out.println(arr[i]); } //表示里面的每一个字符都被消去,所以最后是什么都没有
7.排序字符串(需要将字符串切割成数组才能排序)
String a="12 45 56 78 5 8 10"; String b[]=a.split(" "); int arr[] =new int[b.length]; for(int i=0;i<arr.length;i++) { arr[i]=Integer.parseInt(b[i]); } Arrays.sort(arr); String atr=""; for(int i=0;i<arr.length;i++) { if(i==arr.length-1) atr=atr+arr[i]; else atr=atr+arr[i]+" "; } System.out.println(atr); //5 8 10 12 45 56 78
8.替换功能
String s="ef43vft65"; String m=s.replaceAll("\\d", ""); System.out.println(m); //efvft
9.组(分组就是针对重复的字符的解决办法)(就是一个字符同时出现多少次的方法,上面都没提到)
String regex="(...)\\1"; String a="&*(&*("; System.out.println(a.matches(regex));
String regex="(.)\\1+"; String a="asssdfflgggm"; String[] b=a.split(regex); for(int i=0;i<b.length;i++) System.out.println(b[i]); /* a d l m */
String regex="\\."; String a="m...m..yy..nnaa..mme..iiiss.sun."; String m=a.replaceAll(regex,"").replaceAll("(.)\\1+", "$1"); System.out.println(m);//mynameisun
出现几个点本来就要出现几个字符,然后用括号标志起来就成为一个整体,看作一个字符,不能拆分,然后后面说重复一次,字符个数就翻一倍,而且前后两组都应该相同。
10.在一个字符串里获取我们需要的一定规则的字符串(也就是我们的正则的对象是在一个字符串里面,不是整个字符串)
String regex="(..)\\1+"; Pattern p=Pattern.compile(regex); Matcher m=p.matcher("每天我都是欢喜欢喜的,我很开心"); m.find(); System.out.println(m.group()); //欢喜欢喜