码迷,mamicode.com
首页 > 编程语言 > 详细

java基础-正则表达式

时间:2018-08-07 20:41:59      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:int   模式   就是   ace   return   结果   ret   除了   ababc   

1. 正则表达式规则     

字符
    x 字符 x。举例:‘a‘表示字符a
    \\ 反斜线字符。
    \n 新行(换行)符 (‘\u000A‘) 
    \r 回车符 (‘\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]

边界匹配器
    ^ 行的开头 
    $ 行的结尾 
    \b 单词边界, 就是不是单词字符的地方。
    
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("\n\t第%s组的结果是:%s", i + 1,
                        match1.group(i + 1)));
            }
            System.out.print("\n匹配的整个结果:");
            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("\n\t第%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("\n\t第%s组的结果是:%s", i + 1,
                            matcher.group(i + 1)));
                }
                System.out.print("\n匹配的整个结果:");*/
                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基础-正则表达式

标签:int   模式   就是   ace   return   结果   ret   除了   ababc   

原文地址:https://www.cnblogs.com/ou-pc/p/9417703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!