正则表达式规则整理记录

本文详细介绍了正则表达式的单字符、多字符及复杂匹配规则,包括贪婪与非贪婪匹配。通过实例展示了如何在Java中进行字符串搜索与分割,并探讨了正则表达式在字符串替换中的应用,如使用反向引用增强替换灵活性。正则表达式是处理文本的强大工具,适用于处理各种不规范的数据输入。
摘要由CSDN通过智能技术生成

单字符匹配规则
正则表达式规则可以匹配
A指定字符A
\u548c指定Unicode字符
.任意字符a,b,_,$,#
\d数字0~90 ~ 9
\D非数字除数字外
\w字母、数字和下划线a~ z, A~ Z, 0~9, _
\W非\w$, &,
\s空格、Tab键空格,Tab
\S非\s字母,数字,下划线,中文,&等
多字符匹配规则
正则表达式规则可以匹配
A*任意个数的该字符空,AAAAAAAAA
A+至少一个该字符AAAAAAAAA
A?0或1个该字符空,A
A{3}指定个数的字符(n)AAA
A{2,3}指定范围个数字符AA, AAA
A{2,}至少几个字符AA, AAAA, AAAA
A{0,3}最多几个字符空,A, AAAAA
复杂匹配规则
正则表达式规则可以匹配
^开头字符串开头
$结尾字符串结尾
[ABC][…]中括号内任意单字符A, B,C
[A-C0-2xyz]指定范围的字符A, B,C,0, 1,2,x, y,z
[^A-C]指定范围外任意字符D, E
AB|CD|EF或的关系AB, CD, EF
(AB|CD|EF)()起到分组和子串作用,属于分组匹配用AB, CD, EF
(\d+)(0*)贪婪匹配,\d+会匹配尽可能多的字符,譬如12300/10100/112,第二组0*匹配会为空第一组会匹配到12300, 10100, 112
(\d+?)(0*)非贪婪匹配,\d+?会匹配尽可少的字符,譬如12300/10100/112,第一组不会匹配后面的0,第二组匹配后面的0,类似后面的规则优先第一组只匹配到123, 101112
非贪婪匹配

如上已介绍,正则表达式匹配默认使用贪婪匹配,可以使用 ? 表示对某一规则进行非贪婪匹配。
看下正则表达式 (\d+)(0*),分组去匹配10100得到的结果将是:第一组10100,第二组空,就是因为贪婪匹配下,第一组去尽可能多的匹配了。如果写成==(\d+?)(0*)== ,则结果将是第一组101,第二组00

再来看这个正则表达式 (\d??)(6*) ,注意 \d? 表示匹配0个或1个数字,后面第二个 ? 表示非贪婪匹配,因此,给定字符串"666666",匹配到的两个子串分别是"“和"666666”,因为对于 \d? 来说,可以匹配1个6,也可以匹配0个6,但是因为后面的 ? 表示非贪婪匹配,它就会尽可能少的匹配,结果是匹配了0个6
注意区分 ? 的含义:\d??

搜索、分割、替换

分割
Java中常使用String.split()方法传入的正是正则表达式,

“a b c”.split("\s"); // { “a”, “b”, “c” }
“a b c”.split("\s"); // { “a”, “b”, “”, “c” }
“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

我们获取到Matcher对象后,不需要调用matches()方法(因为匹配整个串肯定返回false),而是反复调用find()方法,在整个串中搜索能匹配上\wo\w规则的子串,并打印出来。这种方式比String.indexOf()要灵活得多,因为我们搜索的规则是3个字符:中间必须是o,前后两个必须是字符[A-Za-z0-9_]。[^1]

替换
使用正则表达式替换字符串可以直接调用String.replaceAll(),它的第一个参数是正则表达式,第二个参数是待替换的字符串,

String r = s.replaceAll("需替换字段", " 新字段 ");

反向引用
常常为某些字段前后添加一些新的内容,其使用方式与替换基本一致,

String r = s.replaceAll("匹配字段", " <b> $1</b> ");

$1 就指代匹配的字段,该结果会在前后加上标签<b>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇独行侠

如果有帮助到您,可以请杯快乐水

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值