[黑马程序员](第25天)高新技术之正则表达式

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

正则表达式

概述:

正则表达式:符合一定规则的表达式

作用:

用于专门操作字符串,描述共享该模式的一组字符串。

java中有String类专门操作字符串为什么还要正则表达式呢?

因为这些功能太简单,组合起来功能代码太多

特点:

用于一些特定符号来表示一些代码操作。这样就简化了书写。

所以学习正则表达式就是在学习一些特殊符号的使用

弊端:

符号定义的愈多,正则表达式越长所以阅读性越差


常见特殊符号:

字符:

X 字符x

\\  反斜线字符

\t 制表符

\n 换行符

\r 回车符

\f 换页符

\e 转义符


字符类

[abc] a,bc(简单类)

[^abc] 除了abc的任何字符

[a-zA-Z] az或者AZ,之内的字母(范围)

[a-d[m-p]] admp即取并集

[a-z&&[def]] d,e,f即取交集

[a-z&&[^bc]] 取的是az,减去bc

[a-z&&[^m-p]] 取的是a到z,减去m到p


预定义字符类

. 任何字符

\d 数字:[0-9]

\D 非数字:[^0-9]

\s 空白字符:[\t\n\xOB\f\r]

\S 非空白字符:[^\s]

\w 单词字符[a-zA-Z_0-9]

\W 非单词字符[^\w]


边界匹配器

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

\Z 输入的结尾,仅用于最后的结束符

\z 输入的结尾


Greedy数量词

X? X,一次或一次也没有

X* X,零次或多次

X+ X,一次或多次

X{n} X,恰好N

X{n,} X,至少n

X{n,m} X,至少n次,但不超过m


具体操作功能:

1, 匹配:

String类中方法boolean String matches()//告知此字符串是否匹配给定的正则表达式

示例:

要求输入5~15位的qq号码,要求0不能开且只能是数字。

[java]  view plain copy
  1. Import java.util.regex;  
  2. class QQDemo{  
  3.     public static void main(String[] args) {  
  4.         String qq = "1323wr55424";  
  5. //方式三:利用正则表达式来实现  
  6. String regex = “[1-9]\\d{4-14}”;//第一位范围是1到9的数字,第二位或到第十五位的必须是0到9的数字  
  7. //用String类里的matches()判断是否符合规范  
  8. if(qq.macthes(regex)){  
  9.     System.out.println(qq);  
  10. }  
  11. else{  
  12.     System.out.println(“你输入的字符非法”);  
  13. }  
  14. /*int len = qq.length(); 
  15.  if (len>=5&&len<=15){         
  16.             if (!qq.startsWith("0")){ 
  17. //方式二:利用封装基本数据类型出现的非数字报异常特点,但是方法不易想到 
  18.                 try{ 
  19.                     long l = Long.paseLong(qq); 
  20.                 } 
  21.                 catch (NumberFormatException e){ 
  22.                     System.out.println("输入的字符非法); 
  23.                 }*/  
  24.                 /*方式一:依次判断,但是速度慢效率低代码臃肿 
  25.                 char[] ch = qq.toCharArray(); 
  26.                 boolean flag = true; 
  27.                 for (int x=0;x<=ch.length ;x++ ){ 
  28.                     if (!(ch[x]>'0'&&ch[x]<='9')){ 
  29.                         flag = false; 
  30.                         break; 
  31.                     } 
  32.                 } 
  33.                 if (flag){ 
  34.                     System.out.println(qq); 
  35.                 } 
  36.                 else{ 
  37.                     System.out.println("输入的字符非法"); 
  38.                 } 
  39.             } 
  40.             else{ 
  41.                 System.out.println("不能以0开头"); 
  42.             } 
  43.         } 
  44.         else{ 
  45.             System.out.println("你输入的长度非法"); 
  46.         } 
  47.     }*/  
  48. }  
  49. 示例二:  
  50. import java.util.regex.*;  
  51. class  Demo{  
  52.     public static void main(String[] args) {  
  53.         //匹配手机号段  
  54.         //13xxx 15xxx 18xxx  
  55.         String haoma = "13837659876";  
  56.         String regex = "1[358]\\d{9}";  
  57.         if (haoma.matches(regex)){  
  58.             System.out.println(haoma);  
  59.         }  
  60.         else{  
  61.             System.out.println("手机号非法");  
  62.         }  
  63.     }  
  64. }  


2,切割:

String类中的String[] split(String regex)  根据给定正则表达式的匹配拆分此字符串。

示例:

[java]  view plain copy
  1. import java.util.regex.*;  
  2. class  Demo{  
  3.     public static void main(String[] args) {  
  4.         //复杂切割,如“张三 李四  王五    周期”,之间空格不确定数  
  5.         //这时可以用"空格+"即多个空格来切  
  6.         splitDemo("张三 李四  王五    周期"," +");  
  7.         //注意不能用“.”直接切,他是个特殊符号。需用\\.来切  
  8.         splitDemo("张三.李四.王五.周期","\\.");  
  9.         /*切割叠词切叠词多少不限,这时需要用到组,(.)\\1+; 
  10.         按照叠词切割可以让规则的结果被重用,可以将规则封装成一个组, 
  11.         用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过 
  12.         \n(n就是组的编号)的形式来获取 
  13.         */  
  14.         splitDemo("errruyuuuussytcd","(.)\\1+");  
  15.     }  
  16.     public static void splitDemo(String str,String reg){  
  17.         String[] names = str.split(reg);  
  18.         for(String name:names){  
  19.             System.out.println(name);  
  20.         }  
  21.     }  
  22. }  


3,替换:

String类中的String replaceAll(String regex,String replacement)

示例:

[java]  view plain copy
  1. import java.util.regex.*;  
  2. class  Demo{  
  3.     public static void main(String[] args) {  
  4.     String replace1 = "shjgdhhawujjjjlaiw";//将重复的字符替换成#。  
  5. String replace3 = "shjg234132535dhhawuj11242353532jjjla34iw";//将连续5个以上的数字替换成#。  
  6.     String replace2 = "shjgdhhawujjjjlaiw";//将重复的字符替换成单个,通过$来获取组的元素  
  7.         replaceAll(replace1,"(.)\\1+","#");  
  8.         replaceAll(replace3,"\\d{5,}","#");  
  9.         replaceAll(replace2,"(.)\\1+","$1");  
  10.     public static void replaceAll(String str,String reg,String newstr){  
  11.         String str1 = str.replaceAll(reg,newstr);  
  12.         System.out.println(str1);  
  13.     }  
  14. }  

获取:

将字符串中的符合规则的子串取出。

操作步骤

1, 将正则表达式封装成对象

2, 让正则对象和要操作的字符串相关连

3, 关联后,获取正则匹配引擎。

4, 通过引擎对符合规则的子串进行操作,比如取出。


查询APIjava.Util.regex中有Pattern

正则表达式的编译表示形式,指定为字符串的正则表达式必须首先被编译为此类的实例

因为该类没有构造函数,可以通过类中的方法获取此类对象。

Static Pattern compile(String regex);//将给定的正则表达式编译到模式中

Matcher matcher(CharSequence input);//创建匹配给定的输入与此模式的匹配器

Mactcher类引擎或匹配器,通过解释Pattern,执行匹配操作的引擎。

Macther类中的常用方法:

Boolean find();//尝试查找与该模式匹配的输入序列的下一个子序列

String group();//返回有以前匹配操作所匹配的输入子序列

说明:

其实String类中的matchers方法,用的就是PatternMacther对象来完成的,

只不过被String的方法封装后,用起来简单且功能也单一。

示例:

[java]  view plain copy
  1. import java.util.regex.*;  
  2. class  Demo2{  
  3.     public static void main(String[] args) {  
  4.         getDemo();  
  5.     }  
  6.     public static void getDemo(){  
  7.         String str = "jin tian jiu shi di er shi wu tian";  
  8.   String reg = "\\b[a-z]{3}\\b";//匹配规则,获取三个字母组成的单词.同时还需用到单词边界匹配器\b  
  9.         //将规则封装成对象  
  10.         Pattern p = Pattern.compile(reg);  
  11.         //让正则对象和要作用的字符串相关联,获取匹配器对象。  
  12.         Matcher m = p.matcher(str);  
  13.         //将规则作用到字符串上并进行符合规则的子串查找  
  14.         //boolean b = m.find();找到返回true,反之false;  
  15.         //System.out.println(b);  
  16.         //获取匹配后的结果,通过while循环,打印出来  
  17.         while (m.find()){  
  18.             System.out.println(m.group());  
  19.         }         
  20.     }  
  21. }  

对于这四种功能什么时候该用哪一个呢?或者那几个呢?

1, 如果只想知道该字符串是否对或错,就使用匹配macthes

2, 想要将已有的字符串编程另一个字符串,使用替换,replaceAll

3, 想要按照自定的方式将字符串变成多个字符串,就用切割split来获取规则以外的子串

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


练习一:

[java]  view plain copy
  1. /* 
  2. 需求:将下面的字符串转换成“我要学编程” 
  3. 我我...要要要要......学学..编编........程程 
  4. */  
  5. class Demo3{  
  6.     public static void main(String[] args) {  
  7.         String str = "我我...要要要要......学学..编编........程程";  
  8.         //先将“..”替换  
  9.         str = str.replaceAll("\\.+","");  
  10.         //再将多个重复内容变成单个  
  11.         str = str.replaceAll("(.)\\1+","$1");  
  12.         System.out.println(str);  
  13.     }  
  14. }  


练习二:

[java]  view plain copy
  1. /* 
  2. 需求:   
  3. 将ip地址进行地址段顺序的排序。   
  4. 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301 
  5. 分析步骤: 
  6. 1,先将所有数前面添0补足最低三位 
  7. 2,将前三位是0的替换 
  8. 3,切割空格 
  9. 4,再将其排序 
  10. */  
  11. import java.util.*;  
  12. class  Demo4{  
  13.     public static void main(String[] args) {  
  14.         String str =   
  15.             "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";  
  16.         str = str.replaceAll("(\\d+)","00$1");//至少保证每段都有三位  
  17.         System.out.println(str);  
  18.         str  = str.replaceAll("0*(\\d{3})","$1");//保证每段只有三位  
  19.         System.out.println(str);  
  20.         String[] s = str.split(" ");//按照空格切割  
  21.         /* 
  22.         TreeSet<String> ts = new TreeSet<String>();//把字符数组的元素添加进集合 
  23.         for(String ss:s){ 
  24.             ts.add(ss); 
  25.         } 
  26.         //从集合取出元素 
  27.         for(String s1:ts){ 
  28.             System.out.println(s1.replaceAll("0*(\\d+)","$1"));//将面多余的0去电 
  29.         } 
  30.         */  
  31.         Arrays.sort(s);//对数组元素进行排序  
  32.         //取出元素  
  33.         for(String s1:s){  
  34.             System.out.println(s1.replaceAll("0*(\\d+)","$1"));//将面多余的0去电  
  35.         }  
  36.   
  37.     }  
  38. }  

练习三:

[java]  view plain copy
  1. /* 
  2. 需求:对邮件地址进行校验 
  3. */  
  4. class  Demo5{  
  5.     public static void main(String[] args) {  
  6.         String mail = "9823hg@as.com.cn";  
  7.         //较为精确匹配  
  8.         String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";  
  9.         //简单匹配  
  10.         //String reg = "\w+@\w+(\\.\\w+)+";  
  11.         System.out.println(mail.matches(reg));  
  12.     }  
  13. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值