zoukankan      html  css  js  c++  java
  • java正则表达式

    正则表达式定义了字符串的模式。
    正则表达式可以用来搜索、编辑或处理文本。
    正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。

    java正则相关类

    相关类位于:java.util.regex包下面

    类Pattern:

    • 正则表达式的编译表示形式
    • Pattern p = Pattern.compile(r,int)//建立正则表达式,并启用相应模式

    类Matcher:

    • 通过解释Pattern对character sequence执行匹配操作的引擎

    demo

    package com.zgx.regex;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.Arrays;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * java正则表达式
     */
    public class RegexTest {
        Matcher m;
        Matcher m2;
        @Before
        public void demo(){
            //在java中遇到转义字符一个要写成两个
            //表达式对象
            Pattern p = Pattern.compile("\w+");//匹配所有字符数字下划线
            //创建Matcher对象
            m = p.matcher("adsfads2452345");
            m2 = p.matcher("adsfads&&2452345");
        }
    
        @Test
        public void demo01(){
            //matches方法尝试将整个字符串与该模式匹配
            System.out.println(m.matches());//true
            System.out.println(m2.matches());//false
        }
    
        @Test
        public void demo02(){
            //find方法扫描输入的序列,查找与该模式匹配的下一个子序列
            System.out.println(m2.find());//true
            System.out.println(m2.find());//true
            System.out.println(m2.find());//false
        }
    
        //分组匹配
        @Test
        public void demo03(){
            //分组匹配
            Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
            Matcher m3 = p.matcher("adf132**adf465**fjf13");
            //group(),group(0)表示匹配这个表达式的字字符串(返回find发现的字符串的所有值)
            while (m3.find()){
                //下面结果为第一次循环的值
                System.out.println(m3.group());//adf132  将find找的的内容全部返回
                System.out.println(m3.group(0));//adf132 将find找的的内容全部返回
                System.out.println(m3.group(1));//adf    将find找的的内容第一个分组内匹配到的数据
                System.out.println(m3.group(2));//132    将find找的的内容第二个分组匹配到的数据
            }
        }
        //替换
        @Test
        public void demo04(){
            //分组匹配
            Pattern p = Pattern.compile("([0-9])");
            Matcher m4 = p.matcher("adf132**adf465**fjf13");
            String newStr = m4.replaceAll("#");
            System.out.println(newStr);//adf###**adf###**fjf##
        }
        //分割
        @Test
        public void demo05(){
            String str = "adf132**adf465**fjf13";
            String[] strings = str.split("\d+");
            System.out.println(Arrays.toString(strings));//[adf, **adf, **fjf]
        }
    }
    
    

    爬虫demo(获取网易首页全部URL)

    package com.zgx.regex;
    
    import org.junit.Test;
    
    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.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class CrawlerTest {
    
        /**
         * 获取urlStr对应的网页的源码内容
         * @param urlStr
         * @return
         */
        public static String getURLContent(String urlStr){
            StringBuilder str = new StringBuilder();
            try {
                URL url = new URL(urlStr);
                BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName("gbk")));
                String temp="";
                while ((temp=reader.readLine())!=null){
                    str.append(temp);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str.toString();
        }
    
        @Test
        public void demo01(){
            String str = getURLContent("http://www.163.com");
            //表达式对象
            Pattern p = Pattern.compile("href="(.+?)"");
            Matcher m = p.matcher(str);
            while (m.find()){
                System.out.println(m.group(1));
            }
        }
    }
    
    

    正则表达式语法

    1、普通字符

    字母、数字、汉字、下划线、以及没有特殊意义的标点符号都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符

    2、简单的转义字符

    字符含义
    代表换行符
    制表符
    代表本身
    ^,$,.,(,),{,},?,+,*,|,[,]匹配这些字符本身

    3、标准字符集合(注意区分大小写,大写是相反的意思)

    字符含义
    d任意一个数字,0-9中的任意一个
    w任意一个字母或数字或下划线,也就是a-zA-Z0-9_中任意一个
    s包括空格、制表符、换行符、等空白字符中其中任意一个
    .小数点表示任意一个字符 但不能匹配换行符

    注:D是指一个非数字

    4、自定义字符集合

    []方括号匹配方式,能够匹配方括号中任意一个字符

    字符含义
    [ab5@]匹配“a”,“b”,“5”,“@”
    [f-k]匹配“f”-“k”之间的任意一个字母
    [^ f-k]^在方括号里面表示取反

    注:特殊符号被包含在中括号中就失去了特殊意义,除了^和-
    标准字符集合除小数点外,如果被包含于中括号中,自定义字符集合就将包含该集合
    [d.-+]将匹配:数字、小数点、+-

    5、量词

    字符含义
    {n}表达式重复n次
    {m,n}表达式至少重复m次,最多重复n次
    {m,}表达式至少重复m次
    匹配表达式0次或者1次,相当于{0,1}
    +匹配表达式至少出现1次相当于{1,}
    *表达式不出现或者出现任意次相当于{0,,}

    匹配次数中的贪婪模式(匹配字符越多越好,默认!)
    匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个“?”号)

    6、字符边界(匹配的不是字符而是位置)

    字符含义
    ^与字符串开始的地方匹配
    $与字符串结束的地方匹配
    匹配一个单词边界

    7、正则表达式的匹配模式

    • IGNORECASE忽略大小写模式
      • 匹配时忽略大小写。
      • 默认情况下,正则表达式是要区分大小写的。
    • SINGLELINE单行模式
      • 真个文本看做一个字符串,只有一个开头,一个结尾。
      • 使用小数点“.”可以匹配包含换行符( )在内的任意字符。
    • MULTILINE多行模式
      • 每行都是一个字符串,都有开头和结尾
      • 在指定了MULTILINE之后,如果需要进匹配字符串开始和结束位置,可以使用A和

    8、选择和分组

    表达式作用
    |分支结构左右两边表达式之间“或”关系,匹配左边或者右边
    ()捕获组(1)在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
     (2)取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到~~~~
     (3)每一对括号会被分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。捕获元素为零的第一个捕获是由整个正则表达式模式匹配的文本
    (?:Expression)一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用

    反向引用( nn)
    每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。
    通过反向引用,可以对分组已捕获的字符串进行引用。

    9、预搜索(零宽断言)

    字符含义
    ?=exp断言自身出现的位置的后面能匹配表达式exp
    ?<=exp断言自身出现的位置的前面能匹配表达式exp
    ?!exp断言此位置的后面不能匹配表达式exp
    ?<!exp断言此位置的前面不能匹配表达式exp

  • 相关阅读:
    VS 2008潜在强大的功能:提取EXE文件中的ICO等资源
    园友们注意:淘宝网上QQ会员 4钻 3元 等都为骗子行为
    Comet Async Process Request Handler
    WCF(Sender) to MSMQ to WCF(Receiver)
    ASP.NET Web Form GridView DetailsView Query Edit
    WCF NetTcp AsyncQueue Service
    Xml CDATA 序列化
    Sync Invoke Remoting Async Invoke
    .Net 4.0 Remoting ConcurrentQueue
    Socket Async Receive Data to LinkedList Buffer (telnet proxy server)
  • 原文地址:https://www.cnblogs.com/zhangguangxiang/p/14232540.html
Copyright © 2011-2022 走看看