ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### [创建正则表达式](https://lingcoder.gitee.io/onjava8/#/book/18-Strings?id=%e5%88%9b%e5%bb%ba%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f) 我们首先从正则表达式可能存在的构造集中选取一个很有用的子集,以此开始学习正则表达式。正则表达式的完整构造子列表,请参考JDK文档`java.util.regex`包中的`Pattern`类。 | 表达式 | 含义 | | :-- | :-- | | `B` | 指定字符`B` | | `\xhh` | 十六进制值为`0xhh`的字符 | | `\uhhhh` | 十六进制表现为`0xhhhh`的Unicode字符 | | `\t` | 制表符Tab | | `\n` | 换行符 | | `\r` | 回车 | | `\f` | 换页 | | `\e` | 转义(Escape) | 当你学会了使用字符类(character classes)之后,正则表达式的威力才能真正显现出来。以下是一些创建字符类的典型方式,以及一些预定义的类: | 表达式 | 含义 | | :-- | :-- | | `.` | 任意字符 | | `[abc]` | 包含`a`、`b`或`c`的任何字符(和`a|b|c`作用相同) | | `[^abc]` | 除`a`、`b`和`c`之外的任何字符(否定) | | `[a-zA-Z]` | 从`a`到`z`或从`A`到`Z`的任何字符(范围) | | `[abc[hij]]` | `a`、`b`、`c`、`h`、`i`、`j`中的任意字符(与`a|b|c|h|i|j`作用相同)(合并) | | `[a-z&&[hij]]` | 任意`h`、`i`或`j`(交) | | `\s` | 空白符(空格、tab、换行、换页、回车) | | `\S` | 非空白符(`[^\s]`) | | `\d` | 数字(`[0-9]`) | | `\D` | 非数字(`[^0-9]`) | | `\w` | 词字符(`[a-zA-Z_0-9]`) | | `\W` | 非词字符(`[^\w]`) | 这里只列出了部分常用的表达式,你应该将JDK文档中`java.util.regex.Pattern`那一页加入浏览器书签中,以便在需要的时候方便查询。 | 逻辑操作符 | 含义 | | :-: | :-- | | `XY` | `Y`跟在`X`后面 | | `X|Y` | `X`或`Y` | | `(X)` | 捕获组(capturing group)。可以在表达式中用`\i`引用第i个捕获组 | 下面是不同的边界匹配符: | 边界匹配符 | 含义 | | :-: | :-- | | `^` | 一行的开始 | | `$` | 一行的结束 | | `\b` | 词的边界 | | `\B` | 非词的边界 | | `\G` | 前一个匹配的结束 | 作为演示,下面的每一个正则表达式都能成功匹配字符序列“Rudolph”: ~~~ // strings/Rudolph.java public class Rudolph { public static void main(String[] args) { for(String pattern : new String[]{ "Rudolph", "[rR]udolph", "[rR][aeiou][a-z]ol.*", "R.*" }) System.out.println("Rudolph".matches(pattern)); } } /* Output: true true true true */ ~~~ 我们的目的并不是编写最难理解的正则表达式,而是尽量编写能够完成任务的、最简单以及最必要的正则表达式。一旦真正开始使用正则表达式了,你就会发现,在编写新的表达式之前,你通常会参考代码中已经用到的正则表达式。