匹配任意字符
精确匹配实际上用处不大,因为我们直接用String.equals()就可以做到。大多数情况下,我们想要的匹配规则更多的是模糊匹配。我们可以用.匹配一个任意字符。
例如,正则表达式a.c中间的.
可以匹配一个任意字符,例如,下面的字符串都可以被匹配:
"abc",因为.可以匹配字符b;
"a&c",因为.可以匹配字符&;
"acc",因为.可以匹配字符c。
但它不能匹配"ac"、“a&&c”,因为.匹配一个字符且仅限一个字符。
匹配数字
用.
可以匹配任意字符,这个口子开得有点大。如果我们只想匹配0~9这样的数字,可以用\d
匹配。例如,正则表达式00\d可以匹配:
"007",因为\d可以匹配字符7;
"008",因为\d可以匹配字符8。
它不能匹配"00A",“0077”,因为\d
仅限单个数字字符。
匹配常用字符
用\w
可以匹配一个字母、数字或下划线,w的意思是word。例如,java\w可以匹配:
"javac",因为\w可以匹配英文字符c;
"java9",因为\w可以匹配数字字符9;。
"java_",因为\w可以匹配下划线_。
它不能匹配"java#","java ",因为\w
不能匹配#、空格等字符。
匹配空格字符
用\s
可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用\t
表示)。例如,a\sc可以匹配:
"a c",因为\s可以匹配空格字符;
"a c",因为\s可以匹配tab字符\t。
它不能匹配"ac","abc"等。
匹配非数字
用\d
可以匹配一个数字,而\D
则匹配一个非数字。例如,00\D可以匹配:
"00A",因为\D可以匹配非数字字符A;
"00#",因为\D可以匹配非数字字符#。
00\d可以匹配的字符串"007","008"等,00\D是不能匹配的。
类似的,\W
可以匹配\w
不能匹配的字符,\S
可以匹配\s
不能匹配的字符,这几个正好是反着来的。
重复匹配
我们用\d
可以匹配一个数字,例如,A\d可以匹配"A0",“A1”,如果要匹配多个数字,比如"A380",怎么办?
修饰符可以匹配任意个字符,包括0个字符。我们用A\d可以匹配:
A:因为\d*可以匹配0个数字;
A0:因为\d*可以匹配1个数字0;
A380:因为\d*可以匹配多个数字380。
修饰符+
可以匹配至少一个字符。我们用A\d+可以匹配:
A0:因为\d+可以匹配1个数字0;
A380:因为\d+可以匹配多个数字380。
但它无法匹配"A",因为修饰符+要求至少一个字符。
修饰符?
可以匹配0个或一个字符。我们用A\d?可以匹配:
A:因为\d?可以匹配0个数字;
A0:因为\d?可以匹配1个数字0。
但它无法匹配"A33",因为修饰符?超过1个字符就不能匹配了。
如果我们想精确指定n个字符怎么办?用修饰符{n}
就可以。A\d{3}可以精确匹配:
A380:因为\d{3}可以匹配3个数字380。
如果我们想指定匹配n~m个字符怎么办?用修饰符{n,m}
就可以。A\d{3,5}可以精确匹配:
A380:因为\d{3,5}可以匹配3个数字380;
A3800:因为\d{3,5}可以匹配4个数字3800;
A38000:因为\d{3,5}可以匹配5个数字38000。
如果没有上限,那么修饰符{n,}
就可以匹配至少n个字符。
总结
单个字符的匹配规则如下:
多个字符的匹配规则如下: