大家好,又见面了,我是你们的朋友全栈君。
一、正则表达式作用
正则表达式定义了字符串的模式,可以用于搜索、编辑或处理文本。
二、Java正则表达式语法规则
1.先清晰一个问题—— 转义字符
例如:
在C语言中,“n”表示换行,同样的Java中我们也可以使用“n”表示换行。对于单个“”如“\”,其后字符表示转义字符,输出一个反斜杠“”。但是双“\”则表明要插入正则表达式的反斜线,其后的字符具有特殊含义。所以在 Java 正则表达式中需要有两个反斜杠才能被解析为其他语言中的转义功能。或者说在 Java 正则表达式中,两个 \ 代表其他语言中的一个 ,这也就是为什么表示一位数字的正则表达式是 \d,而表示一个普通的反斜杠是 \。如下所示。
代码语言:javascript复制System.out.print("\"); // 输出为
System.out.print("\\"); // 输出为 \
2.正则表达式语法
字符 | 说明 |
---|---|
将下一字符标记为特殊字符、文本、反向引用或进制转义符。 例:“n” 表示换行符,“\(” 表示 “(“。 | |
^ | 匹配字符串开始输入的位置。 |
$ | 匹配输入的字符串最末位置。 |
* | 零次或多次匹配前面的字符或子表达式。 例: zo* 匹配”z”和”zoo”。* 相当于 {0,}。 |
| 至少有一次匹配前面的字符或子表达式。 例: “zo ”与”zo”和”zoo”匹配,但与”z”不匹配。 相当于 {1,}。 |
? | 零次或一次匹配前面的字符或子表达式。 例:”do(es)?”匹配”do”或”does”中的”do”。? 相当于 {0,1}。 |
{ n} | 匹配指定的 n 次。(n为非负整数) 例:”o{2}”与”food”中的两个”o”匹配。 |
{ n,} | 最少匹配 n 次。(n为非负整数) 例: “o{2,}”,至少匹配2次,所以”foood”中有 3个o,匹配了3次。 |
{ n,m} | 最少匹配 n 次,最多匹配 m 次。(n、m为非负整数,n <= m) 例:”o{1,3}”匹配1-3个o,所以匹配”fooooood”的前3个o。 PS:逗号和数字之间不能有空格。 |
? | 字符 ? 紧随任何其他限定符(*、 、?、{ n}、{ n,}、{ n,m})之后时,表示匹配模式是”非贪心的”,其搜索尽可能短的字符串,默认的”贪心”模式搜索尽可能长的字符串。 例:在字符串”oooo”中,”o ?”只匹配单个”o”,而”o ”匹配所有”o”。 |
. | 匹配除”r 和 n”之外的任何单个字符。 |
(pattern) | 匹配 pattern 并捕获该匹配的子表达式。若要匹配括号字符 ( ),使用”(“或者”)”。 |
(?:pattern) | 匹配 pattern 但不捕获该匹配的子表达式。 |
(?=pattern) | 执行正向预测先行搜索的子表达式,匹配处于匹配 pattern 的字符串的起始点的字符串。 |
(?!pattern) | 执行反向预测先行搜索的子表达式,匹配不处于匹配 pattern 的字符串的起始点的字符串。 |
x|y | 匹配 x 或 y。 例:’z|food’ 匹配”z”或”food”。'(z|f)ood’ 匹配”zood”或”food”。 |
[ xyz ] | 匹配包含在内的字符。 例:”[abc]”匹配”plainbc”中的”abc”。 |
[^xyz] | 匹配不包含在内的字符。 例:”[^abc]”匹配”plain”中”p”,”l”,”i”,”n”。 |
[a-z] | 匹配在范围内的字符。 例:”[a-z]”匹配a-z的所有小写字母。 |
[^a-z] | 匹配不在范围内的字符。 例:”[^a-z]”匹配除a-z以外的字符。 |
b | 匹配边界字符。 例:”erb”匹配边界上的”er”,不匹配”verb”中间的”er”。 |
B | 不匹配边界字符。 例:”erB”匹配”verb”中间的”er”,不匹配”never”边界上的”er”。 |
cx | 匹配 x 指示的控制字符。(x 的值必须在 A-Z 或 a-z 之间) 例:cM 匹配 Control-M 或回车符。 |
d | 数字字符匹配。相当于 [0-9]。 |
D | 非数字字符匹配。相当于 [^0-9]。 |
f | 换页符匹配。相当于 x0c 和 cL。 |
n | 换行符匹配。相当于 x0a 和 cJ。 |
r | 匹配一个回车符。相当于 x0d 和 cM。 |
s | 匹配任何空白字符,包括空格、制表符、换页符等。 |
S | 匹配任何非空白字符。 |
t | 制表符匹配。相当于 x09 和 cI 。 |
v | 垂直制表符匹配。相当于 x0b 和 cK 。 |
w | 匹配任何字类字符,包括下划线。相当于”[A-Za-z0-9_]”。 |
W | 与任何非单词字符匹配。相当于”[^A-Za-z0-9_]”。 |
xn | 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。 例:”x41″匹配”A”。”x041″与”x04″&”1″等效。允许在正则表达式中使用 ASCII 代码。 |
num | 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。 例:”(.)1″匹配两个连续的相同字符。 |
n | 标识一个八进制转义码或反向引用。如果 n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
nm | 标识一个八进制转义码或反向引用。如果 nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 |
nml | 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
un | 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。 例:u00A9 匹配版权符号 (©)。 |
写在最后, 需要区分不同哦:
在“Java语言规范”中,位于字符串中的单个反斜线(“”)会被解释为“转义字符”。因此必须在字符串中使用双反斜线(“\”)才代表正则表达式,从而不被 Java 字节码编译器解释。
例:“b” 表示 退格;而 “\b” 为正则表达式,表示匹配边界字符。
例: “(hello)” 是非法的;加上“\” 后表示正则表达式,合法 “\(hello\)”。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161590.html原文链接:https://javaforall.cn