一、简介
正则表达式用于文本内容的查找和替换。在线工具https://regexr.com/
元字符 | 说明 |
---|---|
\b | 回退 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\v | 垂直制表符 |
\d | 数字字符,等价于 [0-9] |
\w | 大小写字母,下划线和数字,等价于 [a-zA-Z0-9_] |
\s | 任何一个空白字符,等价于 [\f\n\r\t\v] |
\l | 把下个字符转换为小写 |
\u | 把下个字符转换为大写 |
\L | 把\L 和\E 之间的字符全部转换为小写 |
\U | 把\U 和\E 之间的字符全部转换为大写 |
\E | 结束\L 或者\U |
说明: \D,\W,\S是对上述3个的取非;
二、匹配单个字符
.可以用来匹配任意单个字符,但是在绝大多数实现里面,不能匹配换行符;
. 是元字符,表示它有特殊的含义,而不是字符本身的含义。若要匹配.使用\.
三、匹配一组字符
[]定义一个字符集合; 0-9、a-z 定义了一个字符区间,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。
- 只有在 [ ] 之间才是元字符,在 [ ] 之外就是一个普通字符;
^ 在 [ ] 中是取非操作。
四、重复匹配
- + 匹配 1 个或者多个字符
- * 匹配 0 个或者多个
- ? 匹配 0 个或者 1 个
- {n} 匹配 n 个字符
- {m, n} 匹配 m~n 个字符
- {m,} 至少匹配 m 个字符
注: * 和 + 都是贪婪型元字符,会匹配尽可能多的内容。在后面加 ? 可以转换为懒惰型元字符,例如 *?、+? 和 {m, n}?
regexr:
(1) a.+c
(2) a.+?c
target:
abcabcabccc
第一个正则会匹配到abcabcabccc,有1个匹配
第二个正则会匹配到abc abc abc,有3个匹配
五、位置匹配
单词边界
\b 可以匹配一个单词的边界,边界是指位于 \w 和 \W 之间的位置;\B 匹配一个不是单词边界的位置。
regexr:
\Babc\b
target:
aabc
aabc1
第一个目标串可以匹配到abc
第一个目标串不能匹配
说明abc前面要有字母、数字或下划线,abc后面不能有字母、数字或下划线
字符串边界
^ 匹配整个字符串的开头,$ 匹配结尾。
^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。
分行匹配模式(multiline)下,换行被当做字符串的边界。
regexr:
^\s*\/\/.*$
target:
// 注释
说明匹配代码中以 // 开始的注释行
六、子表达式
使用 ( ) 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。可以嵌套。
regexr:
(ab){2,}
target:
ababab
说明:匹配2个以上ab组成的字符串
regexr:
(19|20)/d{2}
target:
1900
说明:匹配19或20后面两个数的字字符串
例子:匹配IP地址
IP地址每部分都是0-255,
将其划分为一下5个部分
0-9
10-99
100-199
200-249
250-255
故0-255的正则是 ((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))
regexr:
(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))
target:
1.1.1.1
七、回溯引用
回溯引用使用 \n (n为数字) 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。
regexr:
<(h[1-6])>\w*?<\/\1>
target:
<h1>x</h1>
说明:匹配html中标题元素
八、前后查找
向前查找用 ?= 来定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。
regexr:
\w+(?=@)
target:
abc@qq.com
说明:查找出邮件地址 @ 字符前面的部分。
九、在Java中使用
public class Test {
public static void main(String[] args) {
String str = "<h1>test</h1>";
boolean result = str.matches("<(h[1-6])>\\w*?<\\/\\1>");
System.out.println(result);
}
}