阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

复杂匹配规则

29次阅读
没有评论

共计 1463 个字符,预计需要花费 4 分钟才能阅读完成。

匹配开头和结尾

用正则表达式进行多行匹配时,我们用 ^ 表示开头,$表示结尾。例如,^A\d{3}$,可以匹配"A001""A380"

匹配指定范围

如果我们规定一个 7~8 位数字的电话号码不能以 0 开头,应该怎么写匹配规则呢?\d{7,8}是不行的,因为第一个 \d 可以匹配到0

使用 [...] 可以匹配范围内的字符,例如,[123456789]可以匹配1~9,这样就可以写出上述电话号码的规则:[123456789]\d{6,7}

把所有字符全列出来太麻烦,[...]还有一种写法,直接写 [1-9] 就可以。

要匹配大小写不限的十六进制数,比如1A2b3c,我们可以这样写:[0-9a-fA-F],它表示一共可以匹配以下任意范围的字符:

  • 0-9:字符0~9
  • a-f:字符a~f
  • A-F:字符A~F

如果要匹配 6 位十六进制数,前面讲过的 {n} 仍然可以继续配合使用:[0-9a-fA-F]{6}

[...]还有一种排除法,即不包含指定范围的字符。假设我们要匹配任意字符,但不包括数字,可以写[^1-9]{3}

  • 可以匹配"ABC",因为不包含字符1~9
  • 可以匹配"A00",因为不包含字符1~9
  • 不能匹配"A01",因为包含字符1
  • 不能匹配"A05",因为包含字符5

或规则匹配

| 连接的两个正则规则是 规则,例如,AB|CD表示可以匹配 ABCD

我们来看这个正则表达式java|php

// regex
public class Main {public static void main(String[] args) {String re = "java|php";
        System.out.println("java".matches(re));
        System.out.println("php".matches(re));
        System.out.println("go".matches(re));
    }
}

它可以匹配 "java""php",但无法匹配"go"

要把 go 也加进来匹配,可以改写为java|php|go

使用括号

现在我们想要匹配字符串 learn javalearn phplearn go怎么办?一个最简单的规则是 learn\sjava|learn\sphp|learn\sgo,但是这个规则太复杂了,可以把公共部分提出来,然后用(...) 把子规则括起来表示成learn\s(java|php|go)

// regex
public class Main {public static void main(String[] args) {String re = "learn\\s(java|php|go)";
        System.out.println("learn java".matches(re));
        System.out.println("learn Java".matches(re));
        System.out.println("learn php".matches(re));
        System.out.println("learn Go".matches(re));
    }
}

上面的规则仍然不能匹配 learn Javalearn Go 这样的字符串。试修改正则,使之能匹配大写字母开头的learn Javalearn Phplearn Go

小结

复杂匹配规则主要有:

正则表达式 规则 可以匹配
^ 开头 字符串开头
$ 结尾 字符串结束
[ABC] […]内任意字符 A,B,C
[A-F0-9xy] 指定范围的字符 A,……,F0,……,9xy
[^A-F] 指定范围外的任意字符 A~F
AB|CD|EF AB 或 CD 或 EF ABCDEF

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1463字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中