正则匹配

正则匹配

基本使用

java.util.regex 包主要包括以下三个类:

* Pattern 类
正则表达式的编译表示。没有公共构造方法,必须首先调用其公共静态编译方法获得 Pattern 对象。

* Matcher 类
对输入字符串进行解释和匹配操作的引擎。没有公共构造方法,需要调用 Pattern 对象的 matcher 方法获得 Matcher 对象。

* PatternSyntaxException 类
非强制异常类,表示正则表达式模式中的语法错误。
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    public static void main( String args[] ) {
        Pattern p = Pattern.compile("abc");        // 编译正则表达式
        Matcher matcher = p.matcher("abcdefg");    // 放入字符串中匹配

        System.out.println(((Matcher) matcher).lookingAt());   // 是否存在子串匹配 true
        System.out.println(matcher.matches());     // 是否完全匹配 false
    }
}

正则表达式

在 Java 中,正则表达式编译需要再经过一次转义。因此 \\ 才表示插入一个正则表达式的反斜线!

字符类(默认匹配一个字符)

[abc]           只能是a, b, 或c                
[^abc]          除了a, b, c之外的任何字符      
[a-zA-Z]        a到z A到Z,包括(范围)        
[a-d[m-p]]      a到d,或m到p(并集)           
[a-z&&[def]]    d, e, 或f(交集)              
[a-z&&[^bc]]    a到z,除了b和c                
[a-z&&[m-p]]    a到z,除了m到p                

预定义的字符类(默认匹配一个字符)

.	        任何字符
\d	        一个数字: [0-9]
\D	        非数字: [^0-9]
\s	        一个空白字符: [ \t\n\x0B\f\r]
\S	        非空白字符: [^\s]
\w	        [a-zA-Z_0-9] 英文、数字、下划线
\W	        [^\w] 一个非单词字符

贪婪的量词(配合匹配多个字符)

X?	        X , 一次或根本不
X*	        X,零次或多次
X+	        X , 一次或多次
X {n}	        X,正好n次
X {n, }	        X,至少n次
X {n,m}	        X,至少n但不超过m次		

字符串对象提供了匹配正则表达式的方法

// 判断是否匹配正则表达式,匹配返回true,不匹配返回false
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false

public class RegexDemo04 {
    public static void main(String[] args) {
        String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";

        String[] arrs = names.split("\\w+");                // 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]);
        }

        String names2 = names.replaceAll("\\w+", "  ");    // 按照正则表达式匹配的内容进行替换
        System.out.println(names2);
    }
}

捕获组

我们可以在正则表达式中同时捕获多个结果,最终以 group 的形式呈现

public class RegexDemo05 {
    public static void main(String[] args) {
        String rs = "学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";

        // 需求:从上面的内容中爬取出 电话号码和邮箱。
        // 1、定义爬取规则,字符串形式
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})" +
                "|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";

        // 2、把这个爬取规则编译成匹配对象。
        Pattern pattern = Pattern.compile(regex);

        // 3、得到一个内容匹配器对象
        Matcher matcher = pattern.matcher(rs);

        // 4、开始找了
        while (matcher.find()) {
            String rs1 = matcher.group();
            System.out.println(rs1);
        }
    }
}
posted @ 2022-11-28 20:19  晚点心动。  阅读(81)  评论(0)    收藏  举报