一、正则表达式
- 正则表达式:符合一定规则的表达式。
- 作用:用于专门操作字符串。
- 特点:用一些特点的符号来表示一些代码操作,这样就简化了书写。
- 好处:可以简化对字符串的复杂操作。
- 弊端:符号定义越多,正则越长,阅读性越差。
1.1、匹配
String类的boolean matches()方法:用规则匹配整个字符串,只要一处不符合规则,就匹配结束。
- [abc]:表示字符串中任意位置如果有a或者b或者c才返回真,注意是单个字符。
- [~abc]:表示字符串中任意位置只要不是a或者b或者c才返回真,单个字符。
- [abc][1-9]:表示第一个位置只能是a或者b或者c,字符串第二个位置只能是1-9之间。
拓展:[a-zA-Z][0-9]:表示第一个位只能是字母,第二位只能是数字。
- [a-d[m-p]]:取并集,也可以写成[a-dm-p]。
- [a-z&&[des]]:取交集,d,e或者f。
- [a-z&&[~bc]]:a-z中除了b和c。
- [a-z&&[~m-p]]:a-z中,除了m-p。也就是除了m,o,p外都行。
在正则表达式中,反斜杠要出现都是一对对出现的。
1.2、预定义字符类
- . 任何字符(与结束符可能匹配也可能不匹配)。
- \d 数字[0-9]
- \D 非数字[~0-9]
- \s 空白字符。
- \S 非空白字符。
- \w 单词字符。字母数字和下划线。[a-zA-Z_0-9]
- \W 非单词字符。
1.3、Greedy 数量词
(X表示正则表达式,匹配的是整个字符串)
- X? X,一次或一次也没有
- X* X,零次或多次
- X+ X,一次或多次
- X{n} X,恰好 n 次
- X{n,} X,至少 n 次
- X{n,m} X,至少 n 次,但是不超过 m 次
练习:匹配手机号,手机号段只有 13xxx 15xxx 18xxx
1.4、正则表达式使用
1、切割:
String[] split(String regex); 特殊切割:
(1)splitDemo("zhangsan lisi wangwu"," +"); //String reg = " +";//按照多个空格进行切割(2)/splitDemo("zhangsan.lisi.wangwu","\\."); //String reg = "\\.";//因为正则.为特殊符号,所以需要转义。(3)splitDemo("c:\\abc\\a.txt","\\\\"); //String reg = "\\\\";//因为一个反斜杠需要两个表示才不能转义,所以两个就需要四个来切。(4)splitDemo("erkktyqquio","(.)\\1"); //按照叠词完成切割。让规则结果被重用。可以将规则封装成组,用()完成,组的出现都有编号,从1开始。想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。(5)splitDemo("erkkkkkktyqqqqqquio","(.)\\1+"); //按照多叠词完成切割。
例:solitDemo方法我自定的,看起来简便。复习时,看怎么操作就行。
public static void splitDemo(String str,String reg){ String[] arr = str.split(reg); for(String s:arr){ System.out.println(s); }}
2、替换
String replaceAll(String regex, String replacement)
3、获取
String str = "ming tian jiu yao fang jia la。";//取出连续出现四个单词String reg = "\\b[a-z]{4}\\b";//将规则封装成对象Pattern p = Pattern.compile(reg);//让正则对象和要作用的字符串相关联获取匹配器对象。Matcher m = p.matcher(str);while (m.find()) { System.out.println(m.group()); System.out.println(m.start()+"::"+m.end());//获取角标}
其实String类中的maches()方法就是Pattern和Matcher对象来完成的。只不过被String的方法封装后用起来较为简单,但是功能却单一。
- boolean find();//将规则作用到字符串上,并进行符合规则的子串查找。
- m.group()用于获取匹配后结果。