黑马程序员_正则表达示

来源:互联网 发布:学校封了游戏端口 编辑:程序博客网 时间:2024/06/01 09:04

------- android培训、java培训、期待与您交流! ----------

/*|-java.util.regex; |-Matcher|- find() 查找下一个匹配的子串|- group() 返回匹配的子串|- replaceAll 替换|-Pattern|- compile(regex) 将给定的正则表达式编译到模式中。|- matcher(str) 匹配要操作字符串,获取匹配器对象 |- matches 匹配|- split 切割*/

 调用顺序:

   Pattern p = Pattern.compile("a*b");

   Matcher m = p.matcher("aaaaab");

   boolean b = m.matches();


一.基本概念

1) String类中多种方法来操作字符串,比较复杂。就出现正则表达示,按规则匹配字符串,操作简便,且简化了代码的书写

2) 概念:正则表达示就是符合一定规则的表达示

3) 作用:专门用于操作字符串

4) 特点:用一些特定符号 ,来表示代码操作,就简化了书写。

5) 好处:简化字符串的复杂操作。 弊端:符号越多,规则越长,阅读性太差。

6) 常用符号:

/* <字符类>[abc]: abc中的一个 [^abc]: 任意字符,非abc [a-zA-Z]: 取并集 [a-d[m-p]]: 取并集  [a-d&&[def]]: 取交集[a-z&&[^bc]]: 取非bc [a-z&&[^m-p]]: 取非m-p<Greedy数量词>X?:0次或1次X*:0次或n次X+:1次或n次X{n}:恰好n次X{n,}:至少n次X{n,m}:有n到m次<预定义字符类>\d:数字[0-9]\D:非数字[^\d]\w:单词字符[a-zA-Z_0-9]\W:非单词字符[^\w]\s:空白字符:[\t\n\x0B\f\r] \S:非空白字符[^\s]*/

二.四种具体的操作功能

1) 匹配:将字符串按规则进行匹配matches()操作,只要字符串中有一处不匹配,就匹配结束,返回false.

/*格式:boolean b = str.matches(regex);例:String str = "abc123";boolean b1 = str.matches("[a-z]+\\d?");boolean b2 = str.matches("[a-z]{3,}\\d+");*/

2) 切割:将字符串str按规则regex,进行切割split()操作,得到一个数组arr.

格式:String[] arr = str.split(regex);

1. 斜杠\在正则中是成对出现的。

regex = "\\\\"; 按\\进行切割

regex = "\\."; 按.进行切割

regex = " +"; 按多个空格进行切割


2. 按叠词进行切割,组()

叠词的规则:regex = "(.)\\1+";

叠词:aaa,dd,qqq,哈哈

前面一个字符是任意字符用"."表示,添加一个括号(.)封装成一个组

后面的一个字符和前面 一个相同,就用前一个组 ,用\n(n就是组的编号 )获取

组:将要重复使用的规则用()封装成组,让规则重用。

组:((())())

作用:封装规则,以便规则重用。

个数:即左括号的个数。

编号:从1开始,按左括号的顺序编号。


3) 替换:把匹配规则的内容替换成newStr

格式:str.replaceAll(regex,newStr);

1. 一般替换,如:把字符串中长度超过5的数字子串替换为*。

例:String str = "qw135990003ei5400935qe";

str = str.replaceAll("\\d{5,}",*);


2. 删除部分内容。即把要删除的内容替换成""。

格式:str.replaceAll(regex,"");

例:String str = "ja....va";

str = str.replaceAll("(\\.)+","");


3. 重复内容,替换为单个词,即叠词去重复。

格式:str.replaceAll("(.)\\1+","$1");

例:String str = "jjjaaavvaa"

str = str.replace("(.)\\1+","$1");

注:$n(n是组的编号)获取规则中的组,作为新的替换内容。


4) 获取:获取符合规则的子串

1. 将规则regex封装成对象p。 Pattern p = Pattern.compile(regex);

2. 将对象p关联要操作的字符串str。  p.matcher(str);

3. 关联后,获取匹配器对象m。  Matcher m = p.matcher(str);

4. 通过匹配器中的方法find(),group()获取子串。

m.find()在str中查找下一个匹配(符合规则)的子串。

m.group()获取查找到的匹配的子串。

例:

public static void main(String[] args){String str = "jin tian tian qi zhen hao!";String regex = "\\b[a-z]{3,4}\\b"; // 单词边界\b// 将规则封装成对象Pattern p = Pattern.compile(regex);// 让对象关联要作用的字符串,获取匹配器对象Matcher m = p.matcher(str);// find查找下一个匹配规则的子串,group返回匹配规则的子串。// 注意:如果在查找前进行过匹配matches(),则从匹配后的位子 开始查找。while(m.find()){System.out.print(m.group()); }}
 

三.四种功能如果去使用。

1) 如果只想知道该字符是否对是错,使用匹配。

2) 想要将已有的字符串变成另一个字符串,替换。

3) 想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。

4) 想要拿到符合需求的字符串子串,获取。获取符合规则的子串。


四.练习

1) 将下面字符串转成:我要学编程。

"我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";

 步骤:

1. 去掉重复的点,即把点替换为""。replaceAll("\\.+","");

2. 叠词去重复,replaceAll("(.)\\1+","$1");

2) ip排序192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30

 步骤:

1. 前面添加2个0,使每个数至少有3位。 replaceALL("(\\d+)","00$1");

2. 去除前面的0,保证每个数只有3位。 replaceALL("0*(\\d{3})","$1");

3. 用空格切割,得到的数组存到TreeSet集合中。

4. for循环取出每个ip,并去掉每个数前面的0。replaceAll("0*(\\d+)","$1");

3)邮箱校验

1. String str = "kx8777@sina.com"

2. String regex = "[a-zA-z_0-9]+@[a-zA-Z]+(\\.[a-zA-Z]+){1,3}"; // 较精确的校验

regex = "\\w+@\\w+(\\.\\w+)+"; // 相对不太精确的校验

3. boolean b = str.matches(regex);

四.其它

1) 正则中的X*:0次或多次

/*str ="";str = str.replaceAll("([b]*)","i");//按一定规则替换为iSystem.out.println(str);str ="b";str = str.replaceAll("([b]*)","i");//按一定规则替换为iSystem.out.println(str);str ="a";str = str.replaceAll("([b]*)","i");//按一定规则替换为iSystem.out.println(str);结果:iiiiai*/



0 0