• 周六. 10月 8th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

java基础-正则表达式

admin

11月 28, 2021

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 = "[email protected]";
        String mail2 = "[email protected]";
        String mail3 = "[email protected]";
        // String mainRegex =
        // "[0-9a-zA-Z_][email protected][0-9a-zA-Z_]++(\.[0-9a-zA-Z_]+{2,4})+";
        String mainRegex = "\[email protected]\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- [email protected] [email protected] =0KFPOS9IR23J0IS [email protected]@ADA.COM.CN [email protected] UFSFJSFI-SI- ";
        Pattern pet2 = Pattern.compile("\b\[email protected]\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();

    }

}

发表回复

您的电子邮箱地址不会被公开。