.1.1. 非打印字符
特别字符 | 描述 |
---|---|
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v] 。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\w | 匹配字母或数字或下划线或汉字 等价于 [^A-Za-z0-9_] |
\d | 匹配数字 |
\D | 匹配非数字 |
.1.2. 特殊符
符号 | 含义 |
---|---|
. | 除\n以外任意字符 |
^ | 当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合 |
| | 二选一 |
.1.3. 限定符
*
+
?
{n}
{n,}
{n,m}
其中* +
为贪婪的,会尽可能多的匹配字符
例: 匹配<h1>不啦不啦不啦</h1>
匹配结果 | ||
---|---|---|
<.*> | 贪婪 | 不啦不啦不啦 |
<.*?> | 非贪婪 |
.1.4. 定位符
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
注:若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。
例
Chapter RegExp
匹配章节标题 | ^Chapter [1-9][0-9]{0,1}$ |
匹配单词开头 | \bCha |
匹配结尾 | ter\b |
匹配中间字符 | \Bapt 但无法匹配apter (开头) |
.1.5. 高级
字符 | 描述 |
---|---|
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如,industr(?:y\|ies) 就是一个比 industry\|industries 更简略的表达式。 |
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows(?=95\|98\|NT\|2000) 能匹配Windows2000 中的Windows ,但不能匹配Windows3.1 中的Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows(?!95\|98\|NT\|2000) 能匹配Windows3.1 中的Windows ,但不能匹配Windows2000 中的Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?<=pattern) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows “能匹配”2000Windows “中的”Windows ",但不能匹配"3.1Windows “中的”Windows "。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?“能匹配”3.1Windows “中的”Windows ",但不能匹配"2000Windows “中的”Windows "。 |
.1.6. 在java中的特殊点
在其他语言中(如Perl),\\
表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\\
表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如Perl),一个反斜杠\
就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个\\
代表其他语言中的一个\
,这也就是为什么表示一位数字的正则表达式是 \\d
,而表示一个普通的反斜杠是 \\\\
。
.1.7. 常用表达式
匹配中文字符:
System.out.println(Pattern.matches("[\u4e00-\u9fa5]", "好"));
匹配Email地址
System.err.println(Pattern.matches("\\w[-\\w.+]*@([A-Za-z0-9][A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", "hello2020@qq.com"));
m-n 位的数字
System.out.println(Pattern.matches("^\\d{1,3}$", "123"));
密码必须由字母和数字组成,且长度要在6-12位之间
System.out.println(Pattern.matches("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$", "123hello456"));
匹配时分秒
System.out.println(Pattern.matches("([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]", "11:10:11"));
IP地址格式
System.out.println(Pattern.matches("((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}", "192.168.21.37"));
网址匹配包含http、https、ftp协议
System.out.println(Pattern.matches("^(https?|ftp)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]", "http://www.bdqn.cn/"));
.1.8. 两个例子
匹配手机号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIY2wVCN-1596860457842)(https://i.loli.net/2020/05/07/HOSsbvIz7it9GBL.jpg)]
捕获组定义:把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B©)),有四个这样的组:
((A)(B©))
(A)
(B©)
©
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。另外还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pc4NRw9q-1596860457845)(https://i.loli.net/2020/05/08/41ikJYgutMd37sf.jpg)]