• 黑马程序员 ---> 正则表达式


    --------------- 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();
    	}
    }
    


  • 相关阅读:
    linuxc查看进程命令
    Springboot+post请求接口
    Springboot+get请求接口
    xml 加载多个properties文件
    TCP的三次握手(建立连接)和四次挥手(关闭连接)
    记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串
    java单点登录原理与简单实现
    关于 Java 面试,你应该准备这些知识点
    Java 内存模型
    java利用SuffixFileFilter统计目录下特定后缀名文件的数目
  • 原文地址:https://www.cnblogs.com/pangblog/p/3318074.html
Copyright © 2020-2023  润新知