• java基础-正则表达式


    1. 正则表达式规则     

    字符
        x 字符 x。举例:'a'表示字符a
        \ 反斜线字符。
        
     新行(换行)符 ('u000A') 
        
     回车符 ('u000D')
        
    字符类
        [abc] a、b 或 c(简单类) 
        [^abc] 任何字符,除了 a、b 或 c(否定) 
        [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) 
        [0-9] 0到9的字符都包括
        
    预定义字符类
        . 任何字符。我的就是.字符本身,怎么表示呢? .
        d 数字:[0-9]
        D 非数字:[^d]/[^0-9]
        w 单词字符:[a-zA-Z_0-9]
       W 非字符[^w]
    
    边界匹配器
        ^ 行的开头 
        $ 行的结尾 
         单词边界, 就是不是单词字符的地方。
        
    Greedy 数量词 
        X? X,一次或一次也没有
        X* X,零次或多次
        X+ X,一次或多次
        X{n} X,恰好 n 次 
        X{n,} X,至少 n 次 
        X{n,m} X,至少 n 次,但是不超过 m 次 
     运算符 
      XY       X后跟 Y 
      X|Y   X 或 Y 
      (X)   X,作为捕获组
    
     
    package com.zwj.string;
    
    import java.util.regex.MatchResult;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class MatcherDemo {
    
        public static void main(String[] args) {
             //userStringRegular();
            //userMatcherRegular();
            userMatcherResultRegular();
        }
    
        /**
         * String类中的三个基本操作使用正则:  匹配:matches() 切割: split() 替换: replaceAll()
         */
        public static void userStringRegular() {
            String str1 = "1 2 3          4 54       5 6";
            String[] numbers = str1.split(" +");
            for (String temp : numbers) {
                System.out.println(temp);
            }
    
            // 替换,替换所有的数字为* abd***:adad*****:asdadasadsfgi#%^^****
            String str2 = "abd123:adad46587:asdadasadsfgi#%^^9090";
            System.out.println(str2.replaceAll("[0-9]", "*"));
            System.out.println(str2.replaceAll("\d", "*"));
    
            // 匹配匹配邮箱
            String mail1 = "ababc@asa.com";
            String mail2 = "ababc@asa.com.cn";
            String mail3 = "ababc@asa";
            // String mainRegex =
            // "[0-9a-zA-Z_]+@[0-9a-zA-Z_]++(\.[0-9a-zA-Z_]+{2,4})+";
            String mainRegex = "\w+@\w+(\.\w{2,4})+";
    
            System.out.println(mail1.matches(mainRegex));// true
            System.out.println(mail2.matches(mainRegex));// true
            System.out.println(mail3.matches(mainRegex));// false
        }
    
        /**
        * java中正则匹配的对象:
        * pattern:
        *       Pattern   Pattern.complie(regexString)
        *       Macther   Pattern.matches(regexString)
        * Matcher:
        *       boolean    matcher.find() //查找下一个匹配对象
        *       String    matcher.guorp() //返回整个匹配模式匹配到的结果
        *       boolean    matcher.matches() //尝试将整个区域与模式匹配
        *    int         matcher.groupCount() //返回匹配规则的分组,如:(aa)(bb):这表示两组
        *       String        matcher.group(int group)    //返回匹配对象对应分组的匹配结果
        *       MatcheResult  matcher.toMatchResult()    //将匹配结果一MatchResult的形式返回
        */
    
        public static void userMatcherRegular() {
            // 匹配出3个字符的字符串
            String str = "abc 124 ewqeq qeqe   qeqe   qeqe  aaaa  fs fsdfs d    sf sf sf  sf sfada dss dee ad a f s f sa a'lfsd;'l";
            Pattern pt = Pattern.compile("\b\w{3}\b");
            Matcher match = pt.matcher(str);
            while (match.find()) {
                System.out.println(match.group());
            }
            // 匹配出邮箱地址
            String str2 = "dadaadad   da da   dasK[PWEOO-123- DASJAD@DHSJK.COM DADA@DAD.CN =0KFPOS9IR23J0IS ADHAJ@565@ADA.COM.CN shuqi@162.com UFSFJSFI-SI- ";
            Pattern pet2 = Pattern.compile("\b\w+@\w+(\.\w{2,4})+\b");
            Matcher match2 = pet2.matcher(str2);
            while (match2.find()) {
                System.out.println(match2.group());
            }
    
            // 匹配
            String sr = "dada ada adad adsda ad asdda adr3 fas daf fas fdsf 234 adda";
            // 包含两个匹配组,一个是三个字符,一个是匹配四个字符
            Pattern pet = Pattern.compile("\b(\w{3}) *(\w{4})\b");
            Matcher match1 = pet.matcher(sr);
            int countAll = match1.groupCount();// 2
            while (match1.find()) {
                System.out.print("匹配组结果:");
                for (int i = 0; i < countAll; i++) {
                    System.out.print(String.format("
    	第%s组的结果是:%s", i + 1,
                            match1.group(i + 1)));
                }
                System.out.print("
    匹配的整个结果:");
                System.out.println(match1.group());
            }
    
            /*
             * 匹配组结果:
             *  第1组的结果是:ada 
             *  第2组的结果是:adad 匹配的整个结果:ada adad 匹配组结果:
             *  第1组的结果是:fas
             *  第2组的结果是:fdsf 匹配的整个结果:fas fdsf 匹配组结果: 第1组的结果是:234 第2组的结果是:adda
             * 匹配的整个结果:234 adda
             */
        }
    
        public static void userMatcherResultRegular() {
    
            String sr = "dada ada adad adsda ad asdda adr3 fas daf fas fdsf 234 adda";
            Pattern pet = Pattern.compile("\b(\w{3}) *(\w{4})\b");
            Matcher match = pet.matcher(sr);
            MatchResult ms = null;
            while (match.find()) {
                ms = match.toMatchResult();
                System.out.print("匹配对象的组结果:");
                for (int i = 0; i < ms.groupCount(); i++) {
                    System.out.print(String.format("
    	第%s组的结果是:%s", i + 1,
                            ms.group(i + 1)));
                }
                System.out.println(ms.group());
            }
        }
    /*匹配对象的组结果:
        第1组的结果是:ada
        第2组的结果是:adad
    匹配的整个结果:ada adad
    匹配对象的组结果:
        第1组的结果是:fas
        第2组的结果是:fdsf
    匹配的整个结果:fas fdsf
    匹配对象的组结果:
        第1组的结果是:234
        第2组的结果是:adda
    匹配的整个结果:234 adda
    
     */
    }

      -- 爬取网页的url

    package com.zwj.string;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class StringDemo {
    
        public static void main(String[] args) {
           
            String str=getURL("https://www.163.com/", "gbk");
            //String regex = "^([hH][tT]{2}[pP]:/*|[hH][tT]{2}[pP][sS]:/*|[fF][tT][pP]:/*)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\/])+(\?{0,1}(([A-Za-z0-9-~]+\={0,1})([A-Za-z0-9-~]*)\&{0,1})*)$";
            String regex="href="([\w\s./:]+?)"";        
            List<String> list=getMatchersubStrings(regex, str);
            for (String string : list) {
            System.out.println(string);
            }
            
    
        }
        
        
        // 爬取网页的URL 返回到list集合里面
        public static List<String>   getMatchersubStrings( String regex,String  str){
            List<String>  list=new ArrayList<String>();
            Pattern patter = Pattern.compile(regex);
            Matcher matcher=patter.matcher(str);
            int countAll=matcher.groupCount();     
             while (matcher.find()) {
                    /*System.out.print("匹配组结果:");
                    for (int i = 0; i < countAll; i++) {
                        System.out.print(String.format("
    	第%s组的结果是:%s", i + 1,
                                matcher.group(i + 1)));
                    }
                    System.out.print("
    匹配的整个结果:");*/
                    list.add(matcher.group(1));
             }
            return  list;
        }
         
        // 爬取163 网页的html 代码
        public static String getURL(String urlstring, String charcode) {
            StringBuilder sb = new StringBuilder();
            URL url = null;
            try {
                url = new URL(urlstring);
                BufferedReader bd = new BufferedReader(new InputStreamReader(
                        url.openStream(), Charset.forName(charcode)));
                String str = null;
                while ((str = bd.readLine()) != null) {
                    sb.append(str);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return sb.toString();
    
        }
    
    }
  • 相关阅读:
    java基础之多线程一:概述
    java基础之io流总结四:字符流读写
    java基础之io流总结三:字节流读写
    java基础之io流总结二:File类基本应用
    java基础之io流总结一:io流概述
    java基础之集合:List Set Map的概述以及使用场景
    java基础之集合长度可变的实现原理
    HDU 4770 Lights Against Dudely 暴力枚举+dfs
    HDU 4771 BFS + 状压
    Codeforces Round #269 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/ou-pc/p/9417703.html
Copyright © 2020-2023  润新知