10.1Java之正则表达式

正则表达式:
是用字符串描述的一个匹配规则,使用正则表达式可以快速判断给定的字符串是否符合匹配规则。(java.util.regex)使用str.matches(String re1),返回值为boolean类型。

转义字符:

正则表达式在Java中是一个字符串,因此,在表达“\”时,需要用到“\\”。
在正则表达式中,表示一个特殊字符需要用到转义字符“\”。例“&”在正则表达式中为“&”。Java中的正则表达式为“\&”。

匹配任意字符

在Java中,正则表达式用“.”表示任意字符,例如“a.b”可以表示“acb”或“a%b”等等。

匹配数字

匹配数字可以用到“\d”,例如“00\d”正则表达式可以匹配:
“007”或“008”。但注意,正则表达式在Java中的“\”要用“\\”。

匹配常用字符

“\w”可以匹配一个字母、下划线、数字。

匹配空格

“\s”可以匹配空格和Tab(Java中表示为“\t”)。

匹配非**

匹配非数字:“\D”
匹配非常用字符:“\W”
匹配非**:“\*”

重复匹配

“00\d”可以匹配“007”,但“0077”怎样匹配?
可以用修饰符“*”,表示任意个或0个字符。
可以用修饰符“+”,表示最少一个字符。
可以用修饰符“?”,表示一个或0个字符。
可以用修饰符“{n}”,表示n个字符。
可以用修饰符“{n,m}”,表示n~m个字符。
可以用修饰符“{n,}”,表示至少匹配n个字符。

匹配开头和结尾

用^表示开头,$表示结尾:例如,“^A\d{3}$”,可以匹配"A001"、“A380”。

匹配指定范围:

匹配1~9的数:[123456789]或[1-9]
匹配a~y的字母:[a-y]
匹配1~9的数或a~y的字母:[1-9a-y]
不匹配包括1~9的数:[^1-9]

或匹配

使用“|”字符,AB|CD表示可以匹配ABCD

括号匹配(匹配字符串)

(java|php|go)可以匹配java、php或go。
括号匹配的是几组字符串。

匹配分组

使用()可以将正则表达式分组,并提取。
例:\d{3,4}\-\d{6,8}将其变为(\d{3,4})\-(\d{6,8}),可以引入java.util.regex包,的Pattern对象匹配,首先创建其正则表达式为Pattern类型,使用Pattern的matcher()方法,获得Matcher对象,匹配成功用group(index)返回子串。

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
        Matcher m = p.matcher("010-12345678");
        if (m.matches()) {
        	String g0 = m.group(0);//010-123456789
            String g1 = m.group(1);//010
            String g2 = m.group(2);//123456789
            System.out.println(g0);
            System.out.println(g1);
            System.out.println(g2);
        } else {
            System.out.println("匹配失败!");
        }
    }
}

在上述代码中我们调用了两个类Pattern和Matcher,这两个类实际上与String.matches()相同,因为String.matches()方法内部调用的就是这两个类。
使用String.matches()方法效率低,因此建议使用Pattern和Matcher这两个类。
步骤:

  1. 使用Pattern的静态方法compile(String 正则)创建Pattern类。
  2. 使用Pattern类的matcher()方法,对字符串进行匹配,返回值为Matcher类的实例。
  3. Mathcer的matches()方法返回值为boolean类型,是否匹配成功,group(index)返回字符串,内容为分组匹配的内容。

非贪婪匹配

Java中正则表达式默认贪婪匹配,例:

"1230000".matches("(\\d+)(0*)");

匹配的第一组数据为“1230000”,第二组为空,这就是贪婪匹配。
非贪婪匹配:在“\d+”后边加一个?,即可非贪婪匹配。
例:(\d??)(9*)匹配“9999”第一组为空,第二组为“9999”。第一个?表示一个或0个,第二个?表示非贪婪匹配。

split()方法

该方法传入的是正则表达式,"a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }

搜索字符串:

public class Main {
    public static void main(String[] args) {
        String s = "the quick brown fox jumps over the lazy dog.";
        Pattern p = Pattern.compile("\\wo\\w");
        Matcher m = p.matcher(s);
        while (m.find()) {
            String sub = s.substring(m.start(), m.end());
            System.out.println(sub);
        }
    }
}
row
fox
dog

替换字符串:String.replaceAll()

public class Main {
    public static void main(String[] args) {
        String s = "The     quick\t\t brown   fox  jumps   over the  lazy dog.";
        String r = s.replaceAll("\\s+", " ");
        System.out.println(r); // "The quick brown fox jumps over the lazy dog."
    }
}

反向引用:

public class Main {
    public static void main(String[] args) {
        String s = "the quick brown fox jumps over the lazy dog.";
        String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
        System.out.println(r);
    }
}

使用replaceAll()的时候,我们传入的第二个参数可以使用$1、$2来反向引用匹配到的子串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值