java匹配规则_复杂匹配规则

匹配开头和结尾

用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾。例如,^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表示可以匹配AB或CD。

我们来看这个正则表达式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 java、learn php和learn 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 Java、learn Go这样的字符串。试修改正则,使之能匹配大写字母开头的learn Java、learn Php、learn Go。

小结

复杂匹配规则主要有:

正则表达式规则可以匹配

^开头字符串开头

$结尾字符串结束

[ABC][…]内任意字符A,B,C

[A-F0-9xy]指定范围的字符A,……,F,0,……,9,x,y

[^A-F]指定范围外的任意字符非A~F

AB|CD|EFAB或CD或EFAB,CD,EF

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值