Java正则表达式

Posted guoDaXia的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java正则表达式相关的知识,希望对你有一定的参考价值。

笔记:

正则表达式的三个作用:
1、用来进行字符串的匹配
2、用来进行替换操作
3、用来提取信息

网络爬虫:
通过超链接获取所有匹配的信息。使用递归完成。正则提取信息。

正则表达式基础:
String的match方法,replace中的使用。
java.util.regex类

Pattern中最基础的正则表达式:
.表示任意字符
\d表示任意数字
\s表示任意空白字符,比如\t,\r
\w表示任意常规字符 a-z,A-Z,0-9,_
\D表示任意非数组
\S表示任意非空格
\W表示任意非常规字符
^在中括号内表示取反。[^\d]表示非数子
[abc]表示匹配a或者b或者c
[a-d]表示匹配a-d之间的字符,也就是a,b,c,c之间的一个
也支持&&和||

基于数量的匹配:
?,*,+
*表示任意多个字符(0个或者多个)
+表示一个或多个
?表示0个或者一个
{n}精确出现n次
{n,}至少出现n次
{n,m}至少出现n次,最多出现m次

边界匹配
^在[]里面表示非,否则表示以什么开头
$表示以什么结尾


Pattern和Matcher的使用:
通过构造得到Pattern对象,通过Pattern对象和目标对象得到Matcher对象,matcher对象有大量方法对它进行处理
Matcher matcher=pattern.matcher("目标字符串");
matcher对象的方法进行操作:
matches():判断是否匹配
find():是否有匹配的对象,如果有,返回true。
group():返回上一个匹配的对象,必须先执行find()才可以group。
reset():重置指针
start():匹配的开始下标
end():匹配的结束下标

替换:
String的replaceAll等方法

提取信息:
正则表达式使用()进行分组,组数十根据左边括号划分的,第一个左括号包括的范围为第一个分组的内容
使用group(xxx)提取符合条件信息中的指定分组的内容,默认是取读所有信息
默认的是贪婪模式:也就是匹配允许的情况下,一次匹配尽量匹配更多的字符,非贪婪模式与之相反。
?加在+或者*后面表示非贪婪模式

 

例子:

package com.t_07;

public class TestReg01 {
    public static void main(String[] args) {
        //.表示任意字符
        System.out.println("a".matches("."));
        //正则表达式进行的是字符的匹配而不是字符串
        System.out.println("aa".matches("."));
        System.out.println("\\d");
        //\\d表示是否是数字,\\D表示非数字
        System.out.println("123".matches("\\d\\d\\d"));
        System.out.println("1d23e".matches("\\d\\D\\d\\d\\D"));
        //\\s表示是否是空白字符,直接写的d表示d这个字符
        System.out.println("1 2  d".matches("\\d\\s\\d\\s\\sd"));
        //\\w表示常用输入字符:a-z,A-Z,0-9,_
        System.out.println("aa b1 22".matches("\\w\\w\\s\\w\\w\\s\\w\\w"));
        //[abcd]表示是否是abcd这四个字符中的某一个
        System.out.println("a".matches("[abcd]"));
        //[a-z]表示是否是在a-z之间的字符
        System.out.println("D".matches("[a-zA-D]"));
        //[^a-z]表示不在a-z之间,^一般用在中括号内,非的范围应该是从符号位置开始到边界符号
        System.out.println("D".matches("[^a-z]"));
        System.out.println("D".matches("[^abc]"));
        System.out.println("b".matches("[^abc]"));
        System.out.println("abc".matches("a^cc"));
        System.out.println("a".matches("[ca^c]"));
        System.out.println("abc".matches("a[^c]c"));
        //&&和||也可以使用
        System.out.println("a".matches("[a-z&&[cef]]"));
        System.out.println("a".matches("[a-z]||[cef]"));
    }

}

 

package com.t_07;

public class TestReg02 {
    
    public static void main(String[] args) {
        //*表示任意多个字符,(0个或多个)
        System.out.println("".matches("a*"));
        System.out.println("aaa".matches("a*"));
        //+表示一个或多个
        System.out.println("".matches("a+"));
        System.out.println("a".matches("a+"));
        System.out.println("aaa".matches("a+"));
        //?表示0个或者1个
        System.out.println("".matches("a?"));
        System.out.println("a".matches("a?"));
        System.out.println("aaa".matches("a?"));
        //{n}表示出现n次,{n,}表示至少出现n次,{n,m}表示至少出现n次,至多出现m次
        System.out.println("2kk-3-12-22".matches("2?\\w+-\\d+-\\d{1,2}-{1}\\d{1,}"));
        
        System.out.println(isPhone("0087-2233445-01"));
        //IP
        System.out.println("192.168.1.255".matches("(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])"));
        
        //身份证号
        System.out.println("".matches("\\d{15}||\\d{18}||\\d{17}[X]"));
    }
    /**
     * 判断一个字符串是否是数字
     */
    public static boolean isNan(String str){
        return str.matches("\\d+\\.?\\d+");
    }
    /**
     * 匹配一个字符串是否是一个电话号码0870-2233445-01
     */
    public static boolean isPhone(String str){
        return str.matches("(0087||021)-\\d{7}-\\d{2}");
    }
    /**
     * 判断一个字符串是否是ip
     */
    public static boolean isIP(String str){
        //192.168.1.102
        return str.matches("(1\\d\\d||2[0-4]\\d||25[0-5])\\.(1\\d\\d||2[0-4]\\d||25[0-5])\\.(1\\d\\d||2[0-4]\\d||25[0-5])");
    }

}

 

package com.t_07;

public class TestReg03 {
    public static void main(String[] args) {
        System.out.println("helloworld".matches("^h\\w+"));
        System.out.println("h".matches("^h\\w+"));
        //^不在[]就表示以什么开头,特别注意:[^abc]
        System.out.println("helloworld".matches("\\w+d$"));
    }
}

 

package com.t_07;

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

public class TestReg04 {
    public static void main(String[] args) {
        //可以先将一个正则表达式编译成为一个Pattern对象,可以提高效率
        Pattern p=Pattern.compile("\\d{4}");
        //通过Pattern可以获取一个Matcher对象,通过Matcher对象可以获取大量的有用信息
        Matcher m=p.matcher("23338888-3232-1111");
        //判断是否匹配
        System.out.println(m.matches());//注意,这些方法的指针都会跑的,这次跑了4个位置,可能对其他方法产生影响
        //将查找的指针重置
        m.reset();
        //find指的是顺序匹配相应的字符串
        //System.out.println(m.find());
        //每进行find一次,就可以将字符串通过group获取,一定呀执行了find才能执行group,没find到
//        System.out.println(m.group());
//        System.out.println(m.find());
//        System.out.println(m.group());
//        System.out.println(m.find());
//        System.out.println(m.group());
//        System.out.println(m.find());
//        System.out.println(m.group());
//        System.out.println(m.find());
//        System.out.println(m.group());
        while(m.find()){
            //start和end方法得到匹配字符的开始下表和结束下标
            System.out.println(m.group()+",start:"+m.start()+",end:"+m.end());
        }
        
        
    }
}

 

package com.t_07;

public class TestReg05 {
    public static void main(String[] args) {
        //第一个参数是正则表达式,第二个参数是要替换的值
        String str="23444422ssdsdsgh2323jdsds";
        System.out.println(str.replaceAll("\\d", "*"));
        System.out.println("18307006930".replaceAll("\\d{4}$","****"));
    }
}

 

package com.t_07;

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

public class TestReg06 {
    public static void main(String[] args) {
        String str="532101197612108712,532122199802021104,532122199700218712";
        //使用括号进行分组
        Pattern p=Pattern.compile("(\\d{6})(\\d{8})\\d{4}");
        Pattern p1=Pattern.compile("(\\d{6}(\\d{8}))\\d{4}");
        Matcher m=p.matcher(str);
        while(m.find()){
            System.out.println("生源地:"+m.group(1)+",出生年月:"+m.group(2));
        }
        Matcher m1=p1.matcher(str);
        while(m1.find()){
            System.out.println(m1.group(1)+"---"+m1.group(2));
        }
        
        /**
         * 贪婪模式
         */
        String str1="<tr><td>桌子</td><td>椅子</td><td>床</td></tr>";
        Pattern p2=Pattern.compile("<td>(.*)</td>");
        Matcher mt=p2.matcher(str1);
        while(mt.find()){
            System.out.println(mt.group(1));
        }
        /**
         * 非贪婪模式,在+或者*后面加?表示非贪婪模式
         */
        Pattern p3=Pattern.compile("<td>(.*?)</td>");
        Matcher mt1=p3.matcher(str1);
        while(mt1.find()){
            System.out.println(mt1.group(1));
        }
    }

}

 

package com.t_07;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestLink {
    /**
     * 将01.html中的所有超链接提取出来
     */
    
    public static void main(String[] args) {
        //getLink(readFile2String("WebRoot/01.htm"));
        getEmail(readFile2String("WebRoot/01.htm"));
    }
    
    public static String readFile2String(String path){
        String str="";
        try {
            FileInputStream input=new FileInputStream(path);
            byte[] buff=new byte[input.available()];
            input.read(buff);
            str=new String(buff,"UTF-8");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
    
    public static void getLink(String str){
        /**
         * 获取所有的超链接
         */
        Pattern p=Pattern.compile("<a\\s+href=\"(.*?)\"");
        //<a.*?\\s+href=[‘\"]([^\"‘>]*?)[‘\"].*?>(.*?)</a> 下面这个是教学视频给出的
        Matcher m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group(1));
        }
    }
    
    public static void getEmail(String str){
        /**
         * 获取所有邮箱
         */
        Pattern p=Pattern.compile("\\w+\\@[\\w+\\.]?\\w+\\.\\w{2,5}");
        Matcher m=p.matcher(str);
        while(m.find()){
            System.out.println(m.group());
        }
    }

}

 

01.html的内容自己脑补。










































以上是关于Java正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java 字符串替换

text 正则表达式片段

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

java正则表达式去除html标签

循环通过 python 正则表达式匹配