zoukankan      html  css  js  c++  java
  • 黑马程序员 ---> 正则表达式

    --------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------

    正则表达式

    一、概述:

    1、概念:符合一定规则的表达式。

    2、作用:用于专门操作字符串。

    3、特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写。

    4、好处:可简化对字符串的基本操作。

    5、弊端:符号定义越多,正则越长,阅读性越差。

    二、常用符号:

    1、字符

    构造                                    匹配

    \                                    反斜线字符

                                        制表符

                                        回车符

    f                                     换页符

    2、字符类

    [abc]                              a、b或c(简单类)

    [^abc]                            任何字符,除了a、b或c(否定)

    [a-zA-Z]                         a到z货A到Z

    [a-d[m-p]]                     a到d或m-p:[a-dm-p](并集)

    3、预定义字符类

                                        任何字符(与行结束符可能匹配也可能不匹配)

    d                                   数字: [0-9]

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

    s                                  空白字符:[ x0Bf ]

    S                                  非空白字符:[^ x0Bf ]

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

    W                                  非单词字符:[^w]

    4、边界匹配器

    ^                                  行的开头

    $                                  行的结尾

                                      单词边界

    B                                  非单词边界

    A                                  输入的开头

    5、Greedy数词量---->匹配整个字符串

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

    X*                                  X,零次或多次

    X+                                  X,一次或多次

    X{n}                               X,恰好n次

    X{n,}                             X,至少n次

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

    6、组和捕获

    组:在正则中用()来表示,作用是结果可以被重用,如(.)\1+,代表的是任意字符出现了多次,就业是叠词

    捕获:在正则中可以使用$加上组的编号来完成捕获的,如:"(.)\1+", "$1"这个$1就代表组代表的元素

     

    三、正则表达式主要有四种具体功能:匹配、切割、替换和获取

    1、匹配:用规则匹配整个字符串,只要有一处不符合,就匹配结束,返回false

    /*
    	 * 匹配:String的matches方法,用规则匹配字符串,只有有一处不符合规则就匹配结束,返回false
    	 */
    	public static void match_method() {
    		// 匹配手机号只有13***,15***,18****
    		String tel = "15900001111";
    		String teiReg = "1[358]\d{9}";
    		System.out.println(tel.matches(teiReg));
    
    		// 匹配多位
    		String str = "a5656";
    		String reg = "[a-zA-Z]\d*";
    		System.out.println(str.matches(reg));
    
    		// 校验QQ号码,5~15,不能0开头,不能有字母
    		String qq = "545454545";
    		String qqReg = "[1-9]\d{4,14}";
    		System.out.println(qq.matches(qqReg));
    	}


    2、切割: split(String regex)

     

    // 按照叠词完成切割。为了可以让规则的结果被重用,可以将规则封装成一个组。用()完成。
    		// 组的出现都有编号。从1开始。 想要使用已有的组可以通过 
    (n就是组的编号)的形式来获取。
    		 split_method("ghghhjhhgkaaalkood", "(.)\1+");
    		// 按照“.”切,.在正则中是代表任意字符,所以需要转译,然而.在双引号中也需要转译
    		 split_method("zhang.li.wang", "\.");
    		// 按照“\”切
    		 split_method("c:\abc\a.txt", "\\");
    		// 按照空格切
    		split_method("abc      a.txt  hhhh", " +");
    
    /*
    	 * 切割 split
    	 */
    	public static void split_method(String str, String reg) {
    		String[] arr = str.split(reg);
    		System.out.println(arr.length);
    		for (String s : arr) {
    			System.out.println(s);
    		}
    	}


    3、替换: replaceAll(String regex, String replacement)

     

    String str = "wer1389980000ty1234uiod234345675f";//将字符串中的数组替换成#。
    		replaceAllDemo(str, "\d{5,}", "*");
    		//将叠词替换成#.  //将重叠的字符替换成单个字母。zzzz->z
    		str = "erkktyqqquizzzzzo";
    		replaceAllDemo(str,"(.)\1+","$1");//$获取组
    
    /*
    	 * 替换
    	 */
    	public static void replaceAllDemo(String str,String reg,String newStr){
    		str = str.replaceAll(reg, newStr);
    		System.out.println(str);
    	}


    4、获取:

    获取:将字符串中的符合规则的子串取出。
    操作步骤:
    1)将正则表达式封装成对象。
    2)让正则对象和要操作的字符串相关联。
    3)关联后,获取正则匹配引擎。
    4)通过引擎对符合规则的子串进行操作,比如取出。

    /*
     * 正则表达式第四个功能:获取,将字符串中符合规则的字串获取出来
     * 
     * 操作步骤:
     * 1、将正则表达式封装成对象
     * 2、让正则对象和要操作的字符串相关联
     * 3、关联之后,获取正则匹配引擎
     * 4、通过引擎对符合规则的字符串进行操作,比如取出
     */
    public class RegexDemo2 {
    	public static void main(String[] args) {
    		getDemo();
    	}
    	
    	public static void getDemo(){
    		String str = "hahahaha hui jia guo nian la";
    		String reg = "\b[a-z]{3}\b";// 单词分隔符//取出str中有三个字母组成的单词
    //		str = "415454d51";
    //		reg = "[1-9]{4,14}";
    		
    		//将正则表达式封装成对象
    		Pattern p = Pattern.compile(reg);
    		
    		//将要操作的字符串和正则对象相关联,获取匹配器对象
    		Matcher m = p.matcher(str);
    		
    		//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
    		//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
    //		System.out.println(m.matches());
    		
    //		boolean b = m.find();//将规则作用到字符串上,并进行符合规则的查找
    //		System.out.println(m.group());
    //		boolean b1 = m.find();//将规则作用到字符串上,并进行符合规则的查找
    //		System.out.println(m.group());
    		
    		while(m.find()){
    			System.out.println(m.group());
    			System.out.println(m.start() + "......" + m.end());
    		}
    	}
    }


    练习:

     

    /*
     * 正则练习
     * 
     * 思路方式:
     * 1、如果只想知道该字符串是对是错使用匹配
     * 2、要想将已有的字符串变成另一个字符串,替换
     * 3、想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
     * 4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
     */
    public class RegexTest {
    
    	public static void main(String[] args) {
    		test_1();
    //		ipSort();
    //		checkMail();
    	}
    
    	/*
    	 * 需求:将下列字符串转成:我要学编程. 到底用四种功能中的哪一个呢?或者哪几个呢?
    	 * 
    	 * 将已有字符串变成另一个字符串。使用 替换功能。 1,可以先将 . 去掉。 2,在将多个重复的内容变成单个内容。
    	 */
    	public static void test_1() {
    		String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
    		str = str.replaceAll("\.+", "");
    		str = str.replaceAll("(.)\1+", "$1");
    		System.out.println(str);
    	}
    
    	/*
    	 * 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
    	 * 将ip地址进行地址段顺序的排序。
    	 * 
    	 * 还按照字符串自然顺序,只要让它们每一段都是3位即可。 
    	 * 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
    	 * 2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。
    	 */
    	public static void ipSort(){
    		String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
    		ip = ip.replaceAll("(\d+)", "00$1");//给每一段都不上0,按照最少位数的需要进行补
    		ip = ip.replaceAll("0*(\d{3})", "$1");//只保留三位数字的字段
    		System.out.println(ip);
    		
    		String[] arrs = ip.split(" +");
    		TreeSet<String> ts = new TreeSet<String>();
    		for(String s : arrs){
    			ts.add(s);
    		}
    		for(String s : ts){
    			System.out.println(s.replaceAll("0*(\d+)", "$1"));
    		}
    	}
    
    	/*
    	 * 需求:对邮件地址进行校验。
    	 */
    	public static void checkMail(){
    		String mail = "abc12@sina.com";
    		String reg = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\.[a-zA-Z]+)+";//较为精确
    //		reg = "\w+@\w+(\.\w)+";//相对不太精确的匹配。
    		
    		System.out.println(mail.matches(reg));
    	}
    }
    

    2、网页爬虫(蜘蛛):

    实际上是一个功能,用于搜集网络上的指定信息,例如百度就在应用这项技术获取各种关键字,可供搜索,简单的说你要在百度上搜索一个“春节”的关键字,它就会找到跟关键字相关联的文章列出来。其实百度事先就在各个网页上获取了相关资源,这个获取资源就是通过网页爬虫技术来完成的。

    需求:可用于收集邮箱等之类的信息。

     

    /*
     * 网页爬虫(蜘蛛)获取网页数据工具
     */
    public class RegexTest2 {
    	public static void main(String[] args) throws IOException {
    //		getMail();
    		getMailByNet();
    	}
    
    	/*
    	 * 获取网页数据,获取网页上有关邮箱的数据
    	 */
    	public static void getMailByNet() throws IOException {
    		URL url = new URL("http://192.168.229.1:8080/myweb/mail.html");
    		URLConnection conn = url.openConnection();
    
    		BufferedReader bfrin = new BufferedReader(new InputStreamReader(
    				conn.getInputStream()));
    		
    		String mailReg = "\w+@\w+(\.[a-zA-Z])+";
    		Pattern p = Pattern.compile(mailReg);
    		String line = null;
    
    		while ((line = bfrin.readLine()) != null) {
    			Matcher m = p.matcher(line);
    			while (m.find()) {
    				System.out.println(m.group());
    			}
    		}
    		bfrin.close();
    	}
    
    	/*
    	 * 获取指定文档中的邮件地址。 使用获取功能。Pattern Matcher
    	 */
    	public static void getMail() throws IOException {
    		BufferedReader bfr = new BufferedReader(new FileReader("mail.txt"));
    
    		String mailReg = "\w+@\w+(\.[a-zA-Z])+";
    		Pattern p = Pattern.compile(mailReg);
    		String line = null;
    
    		while ((line = bfr.readLine()) != null) {
    			Matcher m = p.matcher(line);
    			while (m.find()) {
    				System.out.println(m.group());
    			}
    		}
    		bfr.close();
    	}
    }
    


  • 相关阅读:
    Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
    Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
    Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception
    Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block
    Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级)
    软件研发打油诗祝大家节日快乐
    从挖井的故事中想到开发管理中最容易忽视的几个简单道理
    ITIL管理思想的执行工具发布
    管理类软件设计“渔”之演化
    20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
  • 原文地址:https://www.cnblogs.com/pangblog/p/3318074.html
Copyright © 2011-2022 走看看