本Java教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,可能使用已不再可用的技术。
请参阅Java语言变更以获取Java SE 9及后续版本中更新的语言特性摘要。
请参阅JDK发布说明以了解所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
Pattern
API包含一些有用的预定义字符类,它们为常用的正则表达式提供了方便的简写:
构造 | 描述 |
---|---|
. |
任意字符(可能与行终止符匹配,也可能不匹配) |
\d |
数字:[0-9] |
\D |
非数字:[^0-9] |
\s |
空白字符:[ \t\n\x0B\f\r] |
\S |
非空白字符:[^\s] |
\w |
单词字符:[a-zA-Z_0-9] |
\W |
非单词字符:[^\w] |
在上表中,左侧列中的每个构造都是右侧列中字符类的简写。例如,\d
表示数字范围(0-9),\w
表示单词字符(任何小写字母、任何大写字母、下划线字符或任何数字)。尽可能使用预定义类。它们使您的代码更易于阅读,并消除了由格式不正确的字符类引入的错误。
以反斜杠开头的构造称为转义构造。我们在字符串字面值部分中预览了转义构造,其中提到了用于引用的反斜杠和\Q
和\E
。如果在字符串字面值中使用转义构造,必须在反斜杠前面再加一个反斜杠以使字符串编译。例如:
private final String REGEX = "\\d"; // 一个数字
在这个例子中,\d
是正则表达式;额外的反斜杠是为了代码能够编译。然而,测试工具从Console
直接读取表达式,所以额外的反斜杠是不必要的。
以下示例演示了预定义字符类的使用。
输入你的正则表达式: . 输入要搜索的字符串: @ 我找到了文本"@",起始位置为0,结束位置为1。 输入你的正则表达式: . 输入要搜索的字符串: 1 我找到了文本"1",起始位置为0,结束位置为1。 输入你的正则表达式: . 输入要搜索的字符串: a 我找到了文本"a",起始位置为0,结束位置为1。 输入你的正则表达式: \d 输入要搜索的字符串: 1 我找到了文本"1",起始位置为0,结束位置为1。 输入你的正则表达式: \d 输入要搜索的字符串: a 没有找到匹配项。 输入你的正则表达式: \D 输入要搜索的字符串: 1 没有找到匹配项。 输入你的正则表达式: \D 输入要搜索的字符串: a 我找到了文本"a",起始位置为0,结束位置为1。 输入你的正则表达式: \s 输入要搜索的字符串: 我找到了文本" ",起始位置为0,结束位置为1。 输入你的正则表达式: \s 输入要搜索的字符串: a 没有找到匹配项。 输入你的正则表达式: \S 输入要搜索的字符串: 没有找到匹配项。 输入你的正则表达式: \S 输入要搜索的字符串: a 我找到了文本"a",起始位置为0,结束位置为1。 输入你的正则表达式: \w 输入要搜索的字符串: a 我找到了文本"a",起始位置为0,结束位置为1。 输入你的正则表达式: \w 输入要搜索的字符串: ! 没有找到匹配项。 输入你的正则表达式: \W 输入要搜索的字符串: a 没有找到匹配项。 输入你的正则表达式: \W 输入要搜索的字符串: ! 我找到了文本"!",起始位置为0,结束位置为1。
在前三个例子中,正则表达式简单地是.
(点元字符),表示"任意字符"。因此,在这三种情况下(随机选择的@
字符、一个数字和一个字母),匹配都是成功的。剩下的例子中,每个例子都使用了预定义字符类表中的一个正则表达式构造。您可以参考这个表格来了解每个匹配背后的逻辑:
\d
匹配所有数字\s
匹配空格\w
匹配单词字符或者,大写字母表示相反的意思:
\D
匹配非数字\S
匹配非空格\W
匹配非单词字符