auto commit

This commit is contained in:
CyC2018
2019-11-02 12:07:41 +08:00
parent 182e1440a4
commit bb6e0df82d
784 changed files with 7545 additions and 2827 deletions

View File

@ -23,45 +23,45 @@
# 匹配单个字符
**.** 可以用来匹配任何的单个字符但是在绝大多数实现里面不能匹配换行符
**.** 可以用来匹配任何的单个字符但是在绝大多数实现里面不能匹配换行符
**.** 是元字符表示它有特殊的含义而不是字符本身的含义如果需要匹配 . 那么要用 \ 进行转义即在 . 前面加上 \
**.** 是元字符表示它有特殊的含义而不是字符本身的含义如果需要匹配 . 那么要用 \ 进行转义即在 . 前面加上 \
正则表达式一般是区分大小写的但也有些实现不区分
**正则表达式**
**正则表达式**
```
C.C2018
```
**匹配结果**
**匹配结果**
My name is **CyC2018** .
My name is **CyC2018** .
# 匹配一组字符
**[ ]** 定义一个字符集合
**[ ]** 定义一个字符集合
0-9a-z 定义了一个字符区间区间使用 ASCII 码来确定字符区间在 [ ] 中使用
**-** 只有在 [ ] 之间才是元字符 [ ] 之外就是一个普通字符
**-** 只有在 [ ] 之间才是元字符 [ ] 之外就是一个普通字符
**^** [ ] 中是取非操作
**^** [ ] 中是取非操作
**应用**
**应用**
匹配以 abc 为开头并且最后一个字母不为数字的字符串
**正则表达式**
**正则表达式**
```
abc[^0-9]
```
**匹配结果**
**匹配结果**
1. **abcd**
1. **abcd**
2. abc1
3. abc2
@ -109,15 +109,15 @@ abc[^0-9]
# 重复匹配
- **\+** 匹配 1 个或者多个字符
- **\** * 匹配 0 个或者多个字符
- **?** 匹配 0 个或者 1 个字符
- **\+** 匹配 1 个或者多个字符
- **\** * 匹配 0 个或者多个字符
- **?** 匹配 0 个或者 1 个字符
**应用**
**应用**
匹配邮箱地址
**正则表达式**
**正则表达式**
```
[\w.]+@\w+\.\w+
@ -125,25 +125,25 @@ abc[^0-9]
[\w.] 匹配的是字母数字或者 . 在其后面加上 + 表示匹配多次在字符集合 [ ] . 不是元字符
**匹配结果**
**匹配结果**
**abc.def<span>@</span>qq.com**
**abc.def<span>@</span>qq.com**
- **{n}** 匹配 n 个字符
- **{m,n}** 匹配 m\~n 个字符
- **{m,}** 至少匹配 m 个字符
- **{n}** 匹配 n 个字符
- **{m,n}** 匹配 m\~n 个字符
- **{m,}** 至少匹配 m 个字符
\* + 都是贪婪型元字符会匹配尽可能多的内容在后面加 ? 可以转换为懒惰型元字符例如 \*?+? {m,n}?
**正则表达式**
**正则表达式**
```
a.+c
```
**匹配结果**
**匹配结果**
**abcabcabc**
**abcabcabc**
由于 + 是贪婪型的因此 .+ 会匹配更可能多的内容所以会把整个 abcabcabc 文本都匹配而不是只匹配前面的 abc 文本用懒惰型可以实现匹配前面的
@ -151,23 +151,23 @@ a.+c
## 单词边界
**\b** 可以匹配一个单词的边界边界是指位于 \w \W 之间的位置**\B** 匹配一个不是单词边界的位置
**\b** 可以匹配一个单词的边界边界是指位于 \w \W 之间的位置**\B** 匹配一个不是单词边界的位置
\b 只匹配位置不匹配字符因此 \babc\b 匹配出来的结果为 3 个字符
## 字符串边界
**^** 匹配整个字符串的开头**$** 匹配结尾
**^** 匹配整个字符串的开头**$** 匹配结尾
^ 元字符在字符集合中用作求非在字符集合外用作匹配字符串的开头
分行匹配模式multiline换行被当做字符串的边界
**应用**
**应用**
匹配代码中以 // 开始的注释行
**正则表达式**
**正则表达式**
```
^\s*\/\/.*$
@ -175,47 +175,47 @@ a.+c
<div align="center"> <img src="pics/600e9c75-5033-4dad-ae2b-930957db638e.png"/> </div><br>
**匹配结果**
**匹配结果**
1. public void fun() {
2. &nbsp;&nbsp;&nbsp;&nbsp; **// 注释 1**
2. &nbsp;&nbsp;&nbsp;&nbsp; **// 注释 1**
3. &nbsp;&nbsp;&nbsp;&nbsp; int a = 1;
4. &nbsp;&nbsp;&nbsp;&nbsp; int b = 2;
5. &nbsp;&nbsp;&nbsp;&nbsp; **// 注释 2**
5. &nbsp;&nbsp;&nbsp;&nbsp; **// 注释 2**
6. &nbsp;&nbsp;&nbsp;&nbsp; int c = a + b;
7. }
# 使用子表达式
使用 **( )** 定义一个子表达式子表达式的内容可以当成一个独立元素即可以将它看成一个字符并且使用 * 等元字符
使用 **( )** 定义一个子表达式子表达式的内容可以当成一个独立元素即可以将它看成一个字符并且使用 * 等元字符
子表达式可以嵌套但是嵌套层次过深会变得很难理解
**正则表达式**
**正则表达式**
```
(ab){2,}
```
**匹配结果**
**匹配结果**
**ababab**
**ababab**
**|** 是或元字符它把左边和右边所有的部分都看成单独的两个部分两个部分只要有一个匹配就行
**|** 是或元字符它把左边和右边所有的部分都看成单独的两个部分两个部分只要有一个匹配就行
**正则表达式**
**正则表达式**
```
(19|20)\d{2}
```
**匹配结果**
**匹配结果**
1. **1900**
2. **2010**
1. **1900**
2. **2010**
3. 1020
**应用**
**应用**
匹配 IP 地址
@ -227,27 +227,27 @@ IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下
- 2 开头 2 位是 0-4 的三位数
- 25 开头 3 位是 0-5 的三位数
**正则表达式**
**正则表达式**
```
((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))
```
**匹配结果**
**匹配结果**
1. **192.168.0.1**
1. **192.168.0.1**
2. 00.00.00.00
3. 555.555.555.555
# 回溯引用
回溯引用使用 **\n** 来引用某个子表达式其中 n 代表的是子表达式的序号 1 开始它和子表达式匹配的内容一致比如子表达式匹配到 abc那么回溯引用部分也需要匹配 abc
回溯引用使用 **\n** 来引用某个子表达式其中 n 代表的是子表达式的序号 1 开始它和子表达式匹配的内容一致比如子表达式匹配到 abc那么回溯引用部分也需要匹配 abc
**应用**
**应用**
匹配 HTML 中合法的标题元素
**正则表达式**
**正则表达式**
\1 将回溯引用子表达式 (h[1-6]) 匹配的内容也就是说必须和子表达式匹配的内容一致
@ -255,31 +255,31 @@ IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下
<(h[1-6])>\w*?<\/\1>
```
**匹配结果**
**匹配结果**
1. **&lt;h1>x&lt;/h1>**
2. **&lt;h2>x&lt;/h2>**
1. **&lt;h1>x&lt;/h1>**
2. **&lt;h2>x&lt;/h2>**
3. &lt;h3>x&lt;/h1>
## 替换
需要用到两个正则表达式
**应用**
**应用**
修改电话号码格式
**文本**
**文本**
313-555-1234
**查找正则表达式**
**查找正则表达式**
```
(\d{3})(-)(\d{3})(-)(\d{4})
```
**替换正则表达式**
**替换正则表达式**
在第一个子表达式查找的结果加上 () 然后加一个空格在第三个和第五个字表达式查找的结果中间加上 - 进行分隔
@ -287,7 +287,7 @@ IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下
($1) $3-$5
```
**结果**
**结果**
(313) 555-1234
@ -301,27 +301,27 @@ IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下
| \U | \U \E 之间的字符全部转换为大写 |
| \E | 结束\L 或者\U |
**应用**
**应用**
把文本的第二个和第三个字符转换为大写
**文本**
**文本**
abcd
**查找**
**查找**
```
(\w)(\w{2})(\w)
```
**替换**
**替换**
```
$1\U$2\E$3
```
**结果**
**结果**
aBCd
@ -329,21 +329,21 @@ aBCd
前后查找规定了匹配的内容首尾应该匹配的内容但是又不包含首尾匹配的内容
向前查找使用 **?=** 定义它规定了尾部匹配的内容这个匹配的内容在 ?= 之后定义所谓向前查找就是规定了一个匹配的内容然后以这个内容为尾部向前面查找需要匹配的内容向后匹配用 ?<= 定义: JavaScript 不支持向后匹配Java 对其支持也不完善
向前查找使用 **?=** 定义它规定了尾部匹配的内容这个匹配的内容在 ?= 之后定义所谓向前查找就是规定了一个匹配的内容然后以这个内容为尾部向前面查找需要匹配的内容向后匹配用 ?<= 定义: JavaScript 不支持向后匹配Java 对其支持也不完善
**应用**
**应用**
查找出邮件地址 @ 字符前面的部分
**正则表达式**
**正则表达式**
```
\w+(?=@)
```
**结果**
**结果**
**abc** @qq.com
**abc** @qq.com
对向前和向后查找取非只要把 = 替换成 ! 即可比如 (?=) 替换成 (?!) 取非操作使得匹配那些首尾不符合要求的内容
@ -353,7 +353,7 @@ aBCd
条件为某个子表达式是否匹配如果匹配则需要继续匹配条件表达式后面的内容
**正则表达式**
**正则表达式**
子表达式 (\\() 匹配一个左括号其后的 ? 表示匹配 0 个或者 1 ?(1) 为条件当子表达式 1 匹配时条件成立需要执行 \) 匹配也就是匹配右括号
@ -361,17 +361,17 @@ aBCd
(\()?abc(?(1)\))
```
**结果**
**结果**
1. **(abc)**
2. **abc**
1. **(abc)**
2. **abc**
3. (abc
## 前后查找条件
条件为定义的首尾是否匹配如果匹配则继续执行后面的匹配注意首尾不包含在匹配的内容中
**正则表达式**
**正则表达式**
?(?=-) 为前向查找条件只有在以 - 为前向查找的结尾能匹配 \d{5} 才继续匹配 -\d{4}
@ -379,11 +379,11 @@ aBCd
\d{5}(?(?=-)-\d{4})
```
**结果**
**结果**
1. **11111**
1. **11111**
2. 22222-
3. **33333-4444**
3. **33333-4444**
# 参考资料