黑马程序员——正则表达式

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

正则表达式
1. 正则表达式
    是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
    其实就是一种规则。有自己特殊的应用。
    正则就是用于操作字符串的规则,其中是以一些符号来表示规则的.
    可以理解为:其实符号就是对应了底层的代码,不用再书写代码,
    而是使用一些符号来表示,简化了书写. 正则可以简化对字符串的复杂操作.
2. 正规规则
    (1) 字符
        x 字符x 举例:A就表示字符A
        \\ 反斜线字符 
        \r 回车
        \n 换行           
    (2) 字符类
        [abc] 表示a,或者b,或者c
        [^abc] 表示任何字符,除了a,b,c
        [a-zA-Z] 52个英文字符的任何一个字符
        [0-9] 0-9之间的任意一个字符    
    (3) 预定义字符类
        . 任何字符
        \d [0-9]同意思
        \w 单词字符
        [a-zA-Z_0-9]       
    (4) 边界匹配器
        ^ 行的开头 
        $ 行的结尾 
        \b 单词边界(这里不是一个单词字符) "xa?bc ha h"    
    (5) 数量词 
        X? X,一次或一次也没有 
        X* X,零次或多次 
        X+ X,一次或多次 
        X{n} X,恰好 n 次 
        X{n,} X,至少 n 次 
        X{n,m} X,至少 n 次,但是不超过 m 次
    (6) 常用正则表达式
        //用户名:3-15任意字符组合
        var usernameRegex = /^\w{3,15}$/;
        //密码:6-12任意字符组合
        var passwordRegex = /^\w{6,12}$/;
        //邮箱:自己实现验证规则
        var emailRegex = /^\w+@\w+(\.\w+)+$/;
        //真实姓名:必须是2-5中文
        var realNameRegex =/^[\u4e00-\u9fa5]{2,5}$/;
3. 正则的功能
    匹配功能: 使用String类中的matches方法。先去学习Pattern类,了解规则。 
    字符类,预定义字符类,边界匹配器,Greedy数量词
    切割功能: 使用String类中的split方法。
    替换功能: 使用String类中的replaceAll方法。
    获取功能: 使用的是正则对象Pattern和匹配器Matcher
    在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。
    此方法编译表达式并在单个调用中将输入序列与其匹配。
    字符串凡是涉及到正则表达式的操作,底层就是Pattern和Matcher对象.
4. 组和捕获 
    捕获组可以通过从左到右计算其开括号来编号。
    例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 
    1 ((A)(B(C)))    2A      3 (B(C))    4 (C) 
    组零始终代表整个表达式。 以左括号(来找是第几个组.
    为了提高规则的复用,用()进行封装,每一个括号都有一个编号,从1开始.
    为了复用这个规则,可以通过编号来完成该规则的调用.需要对编号数字进行转义.
    \\1就代表获取第一组规则,表示这个地方的字符和第一组规则相同
    //$符号 可以获取到该方法中正则实际参数中的某一个存在的组,
    通过$加组编号即可String s = str.replaceAll("(.)\\1+","$1");


一些练习:

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class RegexDemo {  
   
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        //String str="zhangsan.lisi.wangwu";  
       // String str="c:\\abc\\a.txt";  
        // String str="erkktyqqquizzzzzo";//按照叠词进行切割  
        // split(str,"\\\\");  
        // split(str,"(.)\\1+");  
         //String str ="wer1389980000ty1234564uiod234345675f";//将字符串中的数据替换成#。  
         //replace(str,"\\d{5,}","#");  
        String str = "erkktyqqquizzzzzo";//将叠词替换成$.  //将重叠的字符替换成单个字母.  
         replace(str,"(.)\\1+","$1");  
        String tel = "18900001111";  
        System.out.println(checkTel(tel));  
    }  
    public static void split(String str,String regex)  
    {  
         String[] s= str.split(regex);  
         for( String s1:s)  
         {  
          System.out.println(s1);  
         }  
         
    }  
    public static void  replace(String str,Stringregex,String newStr)  
    {  
         String s= str.replaceAll(regex, newStr);  
         System.out.println(s);  
    }  
    /* 
    匹配 
    手机号段只有 13xxx 15xxx 18xxxx 
    */  
    public static boolean checkTel(String str)  
    {  
         
        returnstr.matches("1[358]\\d{9}");  
         
    }  
}  
对字符串进行取出
[java] view plaincopy在CODE上查看代码片派生到我的代码片
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
   
//对字符串进行取出  
public class RegexDemo2 {  
    publicstatic void main(String[] args) {  
        Stringstr = "ming tian jiu yao fang jia le ,da jia。";  
        getString(str,"\\b[a-z]{3}\\b");  
   
    }  
    publicstatic void getString(String str,String regex)  
    {  
        Patternp = Pattern.compile(regex);  
        Matcherm = p.matcher(str);  
        while(m.find())  
        {  
            System.out.println(m.group());  
        }  
           
    }  
   
}  </span>
需求:

       对邮件地址进行校验

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代码片派生到我的代码片
import java.util.TreeSet;  
public class RegexTest {  
    public static void main(String[] args) {  
        String mail = "[email protected]";  
      String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";  
      System.out.println(mail.matches(regex));  </span>
  需求:
       将下列字符串转成:我要学编程. 
<span style="font-size:18px;">[java] view plaincopy在CODE上查看代码片派生到我的代码片
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";  
    String regex1="\\.+";  
     str=str.replaceAll(regex1,"");  
    System.out.println(str);  
     str=str.replaceAll("(.)\\1+","$1");  
    System.out.println(str);*/  
        192.68.1.254 102.49.23.013 10.10.10.102.2.2.2 8.109.90.30</span>
  需求:

        将ip地址进行地址段顺序的排序。
        还按照字符串自然顺序,只要让它们每一段都是3位即可。
        1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
        2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。 

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代码片派生到我的代码片
 String str="192.68.1.254102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";  
      String regex1="(\\d+)";  
      str=str.replaceAll(regex1, "00$1");  
      str=str.replaceAll("0*(\\d{3})", "$1");  
       // System.out.println(str);  
      String[] s= str.split("");  
      TreeSet<String> ts=new TreeSet<String>();  
       for(String s1:s)  
       {  
          ts.add(s1);  
       }  
       for(String s2:ts)  
       {  
          System.out.println(s2.replaceAll("0*(\\d+)", "$1"));  
       }  
    }  
}  </span>


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章