[19/05/04-星期六] 正则表示式(Regular Expression)

一、概念

语法:

\D :就是不是0-9数字的其它字符;

\W:与\w相反;

 

a\d?b:表示在字符a和b之间可以有一个数字或者没有数字都可以;如:ab 、a3b

a\d+b:表示在字符a和b之间至少有一个数字,如:a3b 、a34b, 

a\d*b:表示在字符a和b之间至少有0个数字或者多次(不仅限于1次),如:ab、a3b 、a34b, 

^i :假如有很多i,只有字符串开头的i符合条件(默认的是整个文本都是一个字符串,不管你是否换行,整个文本只有一个开头)。

i$:匹配结尾的i

\b:用love\b去匹配love9love love结果是后边2个love符合条件。\b找到是个位置,第一个当光标在第一个love后边,光标的前边是e后边是9都属于\w的范围,

所以不符合。但是第2个love,光标前边e后边是空格,空格不属于\w的范围,符合要求。第3个同理。\w:字母数字下划线。

 

例如:lo goto goto gogo toto dododo

([a-z]{2})\1:匹配到gogo toto dodo 加了括号表示一个捕获组,因为只有一个括号\1表示即可。系统把2个字母保存一下,只有再次重复一下才表示匹配成功

[a-z]+ 表示匹配一个小写字母或者无限个小写字母,或者说匹配一个单词,这个单词至少一个字母,没有字母它也不是单词。

[a-z]+(?=ing) 匹配一个ing结尾的单词,但是ing不计入匹配结果,在匹配中ing不高亮显示。

[a-z]+(?<!\d) 匹配非数字结尾单词

[a-z]+(?<=ing) 匹配一个ing结尾的单词,ing计入匹配结果,在匹配中ing高亮显示。

 

 

解:(0\d{2,3}-\d{7,9})|(1[35789]\d{9})

解:"^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$"

[\w\-]+@[a-z0-9A-Z]+(\.[A-Za-z]{2,4}){1,2}

 【Java代码】

/**
 * 
 */
package expression;

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo01 {
    public static void main(String[] args) {
        //字符串shdjkj890 是否符合正则表达式\w+
        Pattern pattern=Pattern.compile("\\w+");//表达式对象,Java中在正则前加个\一个斜杠变两杠
        Matcher matcher=pattern.matcher("shdjkj890&ik90*7k");//要匹配的目标对象
        //matches()是将整个字符串序列与正则表达式匹配.find() 扫描输入的字符序列,查找与该模式匹配的下一个值序列
        //System.out.println(matcher.matches());//matcher.matches();返回一个Boolean变量,返回true。
        
        
        /*System.out.println(matcher.find());//它的输出结果受到matches()的影响。matches()已经匹配过,指针已经移动了
        System.out.println(matcher.group());//返回第一个符合条件的
        System.out.println(matcher.find());
        System.out.println(matcher.group());//返回第二个符合条件的 ,以此类推*/
        
        /*while (matcher.find()) {//等价于上边的
            System.out.println(matcher.group());//group()和group(0)匹配整个表达式的子字符串    
        }*/
        
        Pattern pattern2=Pattern.compile("([a-z]+)([0-9]+)");
        Matcher matcher2=pattern2.matcher("aa232&ik90*7k56");
        while (matcher2.find()) {
            System.out.println(matcher2.group());//同时符合1组和2组的要求
            System.out.println(matcher2.group(1));//第1组([a-z]+) 单词
            System.out.println(matcher2.group(2));//第2组([0-9]+) 数字        
        }
        
        //替换操作,把数字换成#,matcher3.replaceAll("#")
        Pattern pattern3=Pattern.compile("[0-9]");
        Matcher matcher3=pattern3.matcher("aa232&ik90*7k56");
        System.out.println(matcher3.replaceAll("#"));
        
        //分割操作,以数字作为边界切割字符
        String str="d5678ghh678gh56";
        String arr[]=str.split("\\d+");
        System.out.println(Arrays.toString(arr));
    }
}

【爬虫模拟】

 

/***
 * 用正则表达式 去做网络爬虫
 */
package expression;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo02 {
    
    //获得网页源码的方法
    public static String getURLContent(String urlStr,String charset) throws Exception {
        StringBuilder sb=new StringBuilder();
        URL url=new URL(urlStr);        
        BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream(),Charset.forName(charset) ));
        String temp="";
        while ((temp=reader.readLine())!=null) {
            sb.append(temp);            
        }
        return sb.toString();        
    }
    
    
    public static void main(String[] args) throws Exception {
        String destString=getURLContent("https://www.163.com/","GBK");
        
        //Pattern p=Pattern.compile("<a[\\s\\S]+?</a>");
        Pattern p2=Pattern.compile("href=\"([\\w\\s./:]+?)\"");
        Matcher m=p2.matcher(destString);
        while (m.find()) {
            System.out.println(m.group(1));
            
        }
    }
}

 

posted @ 2019-04-30 00:51  ID长安忆  阅读(350)  评论(0编辑  收藏  举报