参考
最后更新于:2022-04-01 01:19:45
[正则表达式30分钟入门教程](http://www.jb51.net/tools/zhengze.html)
[正则表达式](http://www.java3z.com/cwbwebhome/article/article2/2311.html?id=877)
注释
最后更新于:2022-04-01 01:19:43
注释语法:`(?#comment)`,这个语法的内容会被正则忽略,用于注释含义。可以放在正则表达式的任意位置。
平衡组/递归匹配
最后更新于:2022-04-01 01:19:40
平衡组用于匹配嵌套层次结构,常用于匹配HTML标签(当HTML内容不规范,起始标签和结束标签数量不同时,匹配出正确配对的标签),在此把表达式统一以`\w`为例。
* `(?'group'\w)` 捕获的分组(`\w`匹配到的内容)命名为`group`,并压入堆栈
* `(?'-group'\w)` 捕获分组(`\w`匹配到的内容)后,弹出`group`分组栈的栈顶内容(最后压入的捕获内容),堆栈本来为空,则本分组的匹配失败
* `(?(group)yes|no)` 如果`group`栈非空匹配表达式`yes`,否则匹配表达式`no`
* `(?!)` 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
处理选项
最后更新于:2022-04-01 01:19:38
在表达式里插记号的方式来启用绝大多数的模式,在正则的哪里插入,就从哪里启用。
1. `(?i)`:忽略大小写(CASE_INSENSITIVE)
2. `(?x)`:忽略空格字符(COMMENTS)
3. `(?s)`:`.`匹配任意字符,包括换行符(DOTALL)
4. `(?m)`:多行模式(MULTILINE)
5. `(?u)`:对Unicode符大小写不敏感(UNICODE_CASE),必须启用**CASE_INSENSITIVE**
6. `(?d)`:只有'\n'才被认作一行的中止(UNIX_LINES)
贪婪与懒惰
最后更新于:2022-04-01 01:19:36
**贪婪**:匹配尽可能长的字符串
**懒惰**:匹配尽可能短的字符串
懒惰模式的启用只需在**重复元字符**之后加`?`既可。
* `*?` 重复任意次,但尽可能少重复
* `+?` 重复1次或更多次,但尽可能少重复
* `??` 重复0次或1次,但尽可能少重复
* `{n,m}?` 重复n到m次,但尽可能少重复
* `{n,}?` 重复n次以上,但尽可能少重复
零宽断言(正向和负向)
最后更新于:2022-04-01 01:19:33
零宽断言表示匹配字符的时候再添加一些定位条件,使匹配更精准。
* `\w+(?=ing)` 匹配以`ing`结尾的多个字符(不包括ing)
* `\w+(?!ing)` 匹配**不是**以`ing`结尾的多个字符
* * * *
* `(?<=re)\w+` 匹配以`re`开头的多个字符(不包括re)
* `(?<!re)\w+` 匹配**不是**以`re`开头的多个字符
* * * *
* `(?<=\s)\d+(?=\s)` 匹配两边是空白符的数字,不包括空白符
反向引用
最后更新于:2022-04-01 01:19:31
后面的表达式可以引用前面的某个分组,用`\1`表示,就好像分组1的值赋值给了`\1`这个变量,这个变量可以在后面任意位置引用。
* `\1` 表示分组1匹配的文本
* `\k` 表示分组`Word`匹配的文本
匹配重复两个的英文,例如匹配`Hello Hello`、`lei123 lei123`:
1. `(\w+)\s+\1`
2. `(?\w+)\s+\k`
分组
最后更新于:2022-04-01 01:19:29
在这里我把**表达式**统一以`\w`为例:
* `(\w)` 被一个括号包围起来是一个整体,表示一个分组
* `(\w)(\w)` 自动命名分组,第一个小括号是分组1,第二个小括号是分组2
* `(?'Word'\w+))` 表示定义了一个叫做`Word`的分组
* `(?\w+))` 表示定义了一个叫做`Word`的分组
* `(?:\w+)` 匹配exp,不捕获匹配的文本,也不给此分组分配组号
分支条件
最后更新于:2022-04-01 01:19:27
又叫逻辑运算符,在此`X`和`Y`表示两个**表达式**
* `XY` X紧跟Y
* `X|Y` 表示X或Y,从左到右,满足第一个条件就不会继续匹配了。
反义
最后更新于:2022-04-01 01:19:24
表示不属于元字符或者字符类的字符
**反义元字符**
* `\W` 匹配任意不是字母,数字,下划线,汉字的字符
* `\S` 匹配任意不是空白符的字符
* `\D` 匹配任意非数字的字符
* `\B` 匹配不是单词开头或结束的位置
**反义字符类**
* `[^x]` 匹配除了x以外的任意字符
* `[^aeiou]` 匹配除了aeiou这几个字母以外的任意字符
字符类
最后更新于:2022-04-01 01:19:22
当需要匹配明确的字符或字符集合时候,就用到字符类。
**特殊字符**
* `\0hh` 8进制值hh所表示的字符
* `\xhh` 16进制值hh所表示的字符
* `\uhhhh` 16进制值hhhh所表示的Unicode字符
* `\t` Tab
* `\n` 换行符
* `\r` 回车符
* `\f` 换页符
* `\e` Escape
* `\cN` ASCII控制字符。比如`\cC`代表`Ctrl+C`
* `\p{name}` Unicode中命名为name的字符类,例如`\p{IsGreek}`
**陈列**
* `[aeiou]` 匹配一个元音字符
* `[.?!]` 匹配给定的一个标点
**范围**
* `[0-9]` 匹配0~9的数字,同`\d`
* `[a-z]` 匹配所有小写字母
* `[a-zA-Z]` 匹配所有字母
* `[a-z0-9A-Z_]` 等同于`\w`
字符转义
最后更新于:2022-04-01 01:19:20
如果想匹配元字符本身或者正则中的一些特殊字符,使用`\`转义。例如匹配`*`这个字符则使用`\*`,匹配`\`这个字符,使用`\\`。
需要转义的字符:`$`, `(`, `)`, `*`, `+`, `.`, `[`, `]`, `?`, `\`, `^`, `{`, `}`, `|`
元字符
最后更新于:2022-04-01 01:19:18
元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。
**匹配字符**
* `.` 匹配除换行符以外的任意字符
* `\w` 匹配字母或数字或下划线或汉字
* `\s` 匹配任意的空白符
* `\d` 匹配数字
**匹配位置**
* `\b` 匹配单词的开始或结束
* `^` 匹配字符串的开始
* `$` 匹配字符串的结束
* `\G` 上一个匹配的结尾(本次匹配开始)
* `\A` 字符串开头(类似`^`,但不受处理多行选项的影响)
* `\Z` 字符串结尾或行尾(不受处理多行选项的影响)
* `\z` 字符串结尾(类似`$`,但不受处理多行选项的影响)
**重复**
* `*` 重复零次或更多次
* `+` 重复一次或更多次
* `?` 重复零次或一次
* `{n}` 重复n次
* `{n,}` 重复n次或更多次
* `{n,m}` 重复n到m次
前言
最后更新于:2022-04-01 01:19:15
> 来源:[http://www.xiaoleilu.com/regex-guide/](http://www.xiaoleilu.com/regex-guide/)
> 作者:路小磊
我想在网上最出名的正则相关的一篇文章就是《正则表达式30分钟入门教程》了,说实话这篇文章确实是我的正则入门,但是随着使用熟练,冗长的文章已经不能满足我了,在此做个归纳总结,用于快速查阅。
以下语法在Java中有效,大部分应该是通用的。