# 预定义字符类
Pattern API 包含了一些有用的 预定义的字符类,他提供了常用的正则表达式的简写
构造 | 描述 |
---|---|
. | 任何字符(可能或可能不匹配行终止符) |
\d | 数字: [0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符: [ \t\n\x0B\f\r] |
\S | 非空格字符: [^\s] |
\w | 字词: [a-zA-Z_0-9] |
\W | 非字词: [^\w] |
上面左侧的每个构造都是右侧列中的字符类的简写,所以,尽可能使用预定义的类。它们使您的代码更容易阅读并消除由格式错误的字符类引入的错误。
以反斜杠开始的构造称为转义构造。字符串文字,我们提到使用反斜线和部分 \Q
和 \E
。
如果您使用字符串文字中的转义构造,则必须在反斜杠之前使用要编译的字符串的另一个反斜杠。例如:
private final String REGEX = "\\d"; // a single digit
1
---- Test code ----
System.out.println("--- 任意字符");
regexTest(".", "@");
regexTest(".", "1");
regexTest(".", "a");
System.out.println("--- 数字: [0-9]");
regexTest("\\d", "1");
regexTest("\\d", "a");
System.out.println("--- 非数字: [^0-9]");
regexTest("\\D", "1");
System.out.println("--- 空白字符: [ \\t\\n\\x0B\\f\\r]");
regexTest("\\s", " ");
regexTest("\\s", "a");
System.out.println("--- 非空格字符: [^\\s]");
regexTest("\\S", " ");
regexTest("\\S", "a");
System.out.println("--- 字词: [a-zA-Z_0-9]");
regexTest("\\w", "a");
regexTest("\\w", "!");
System.out.println("--- 字词:非字词: [^\\w]");
regexTest("\\W", "a");
regexTest("\\W", "!");
---- Output ----
--- 任意字符
我发现文本中的 "@" 在开始索引 0 和 结束索引 1.
我发现文本中的 "1" 在开始索引 0 和 结束索引 1.
我发现文本中的 "a" 在开始索引 0 和 结束索引 1.
--- 数字: [0-9]
我发现文本中的 "1" 在开始索引 0 和 结束索引 1.
No match found.
--- 非数字: [^0-9]
No match found.
--- 空白字符: [ \t\n\x0B\f\r]
我发现文本中的 " " 在开始索引 0 和 结束索引 1.
No match found.
--- 非空格字符: [^\s]
No match found.
我发现文本中的 "a" 在开始索引 0 和 结束索引 1.
--- 字词: [a-zA-Z_0-9]
我发现文本中的 "a" 在开始索引 0 和 结束索引 1.
No match found.
--- 字词:非字词: [^\w]
No match found.
我发现文本中的 "!" 在开始索引 0 和 结束索引 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
在前三个例子中,正则表达式是简单的.(“点”元字符),表示“任何字符”。因此,在所有三种情况下(随机选择的 @ 字符,数字和字母), 匹配成功。其余的示例每个都使用“ 预定义字符类”表中的单个正则表达式构造。你可以参考上面的表找出每个测试背后的逻辑:
\d
匹配所有数字
\s
匹配空格
\w
匹配字符字符
或者,大写字母意味着相反的:
\D
匹配非数字
\S
匹配非空格
\W
匹配非字词