# 正则表达式

正则表达式是用于描述**字符排列**和**匹配模式**的一种**语法规则**。它主要用于**字符串的模式分割、匹配、查找及替换操作**，其中最为重要作用是**匹配**。&#x20;

## :pencil2: 正则表达式与通配符

**正则表达式**用来在文件中匹配符合条件的字符串，正则是**包含匹配**。`grep、awk、sed`等命令可以支持正则表达式。

> 正则表达式是包含匹配，即文件中的语句中包含了查找的字符串，那么就显示整行语句。

通配符用来匹配符合条件的文件名，通配符是完全匹配。`ls、find、cp`这些命令不支持正则表达式，所以只能使用`shell`自己的通配符来进行匹配了。

> 通配符必须是完全匹配，如`find . -name “abc？”` 查找到4个字符的文件名其中前三个字符是abc，列出的abcd、abce等文件。&#x20;

## :pencil2: 元字符

&#x20;正则表达式包含了普通字符（A-Za-z0-9）、特殊字符（元字符）列表及它们在正则表达式中的行为。其中，如果要匹配特殊字符，需要用`\`转义，即：匹配`+`，用`\+`。在Linux中，正则表达式可以分为**基本正则表达式**和**扩展正则表达式**。

### :paintbrush: 1、元字符总结

|       元字符      | 作用                                                                                                                              |
| :------------: | ------------------------------------------------------------------------------------------------------------------------------- |
|       `^`      | 匹配输入字符串的开始位置。除非在方括号表达式中使用，表示不包含该字符集合。要匹配`“^”`字符本身，使用转义符转义`“\^”`。                                                                |
|       `$`      | 匹配输入字符串的结尾位置。如果设置了`RegExp`对象的`Multiline`属性，则`“$”`也匹配`‘\r’`或`‘\n’`。要匹配`“$”`字符本身，使用转义符`“\$”`。                                     |
|       `.`      | 匹配除`“\r\n”`之外的任何单个字符。                                                                                                           |
|       `\`      | 将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符。例如，`‘n’`匹配字符`“n”`。`‘\n’`匹配换行符。`‘\\’`匹配`“\”`，而`‘\(’`匹配`“(”`。                                      |
|       `*`      | 匹配前一个字符0次或任意多次，**匹配前一个字符0次**则表示可以匹配任意字符，包括空白行。                                                                                  |
|      `[ ]`     | 字符匹配。匹配所包含的任意一个字符。                                                                                                              |
|      `[^]`     | 赋值字符集合。匹配未包含的任意一个字符。                                                                                                            |
|    `[c1-c2]`   | 字符范围。匹配指定范围内的任意一个字符。例如，`“[a-z]”`可以匹配`“a”`到`“z”`范围内的任意一个小写字符字符。注意：只有连字符（-）在字符组内部，并且出现在两个字符之间时，才能表示字符的范围；如果出现在字符组的开头，则只能表示连字符本身。  |
|      `{n}`     | `n`是一个非负整数，匹配确定的`n`次。例如，`“o{2}”`不能匹配`“Bob”`中的`“o”`，但是能匹配`“food”`中的两个`“o”`。                                                      |
| `{n,}`和 `{,m}` | `n`和`m`均为非负整数，前者至少匹配`n`次，后者至多匹配`m`次。`“o{2}”`不能匹配`“Bob”`中的`“o”`，但是能匹配`“foooood”`中的所有`“o”`。`“o{1,}”`等价于`“o+”`，`“o{0,}”`等价于`“o*”`。 |
|     `{n,m}`    | `m`和`n`均为非负整数，其中`n<=m`，最少匹配`n`次且最多匹配`m`次。                                                                                       |

### :paintbrush: 2、扩展正则表达式元字符总结

|  元字符  | 作用                                                                                                                                                                                                                                                     |
| :---: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|  `+`  | 重复一次或一次以上的前一个字符。执行`“egrep -n 'wo+d' test.txt”`命令，即可查询`“wood”`、`“woood”`、`“woooood”`等字符串。                                                                                                                                                               |
|  `?`  | <p>匹配零次或一次前一个字符。等效于 {0,1}。 当 ? 紧随任何其他限定符（<code>\* 、+、?、{n}、{n,} 或 {n,m}</code>）之后时，匹配模式是非贪婪的。 非贪婪模式匹配搜索到的、尽可能少的字符串，而默认的贪婪模式匹配搜索到的、尽可能多的字符串。</p><p>执行<code>“egrep -n 'bes?t' test.txt”</code>命令，即可查询<code>“bet”</code> 和 <code>“best”</code>这两个字符串。</p> |
|  `\|` | 使用或`(or)`的方式匹配多个字符。执行`“egrep -n 'of\|is\|on' test.txt”`命令，即可查询`“of”` 、`“is”`或 `“on”`这两个字符串。                                                                                                                                                            |
|  `()` | 查找“组”字符串。执行`“egrep -n 't(a\|e)st' test.txt”`命令，即可查询`“tast”` 和 `“test”`这两个字符串。                                                                                                                                                                          |
| `()+` | 匹配多个重复的组。执行`“egrep -n 'A(xyz)+C' test.txt”`命令，查询开头是`“A”`，结尾是`“C”`，中间有一个以上的`“xyz”`的字符串。                                                                                                                                                                 |

### :paintbrush: 3、非打印字符

| 非打印字符 | 匹配                      | 等效于             |
| ----- | ----------------------- | --------------- |
| \f    | 换页符。                    | \x0c 和 \cL      |
| \n    | 换行符。                    | \x0a 和 \cJ      |
| \r    | 回车符。                    | \x0d 和 \cM      |
| \s    | 任何空白字符。 其中包括空格、制表符和换页符。 | \[ \f\n\r\t\v]  |
| \S    | 任何非空白字符。                | \[^ \f\n\r\t\v] |
| \v    | 垂直制表符。                  | \x0b 和 \cK      |

### :paintbrush: 4、多字符

| 多字符 | 功能                                              | 示例                                                                |
| --- | ----------------------------------------------- | ----------------------------------------------------------------- |
| \b  | 与一个字边界匹配；即字与非字之间的位置。                            | er\b 与“never”中的“er”匹配，但与“verb”中的“er”不匹配。                          |
| \B  | 非边界字匹配，即非字与字之间的位置。                              | er\B 与“verb”中的“er”匹配，但与“never”中的“er”不匹配。                          |
| \d  | 数字字符匹配，等效于 \[0-9]。                              | 在搜索字符串“12345”中，\d{2} 与“12”和“34”匹配。 \d 与“1”、“2”、“3”、“4”和“5”匹配。     |
| \D  | 非数字字符匹配。 等效于  \[^0-9]。                          | \D+ 与“abc123 def”中的“abc”和“def”匹配。                                 |
| \a  | 英文字母，等效于\[a-zA-Z]。                              | \a{3} 与 “abc123” 中的“abc”匹配。                                       |
| \w  | 与以下任意字符匹配：A-Z、a-z、0-9 和下划线。 等效于 \[A-Za-z0-9\_]。 | 在搜索字符串“The quick brown fox…”中，\w+ 与“The”、“quick”、“brown”和“fox”匹配。 |
| \W  | 与除 A-Z、a-z、0-9 和下划线以外的任意字符匹配。 等效于 。             | 在搜索字符串“The quick brown fox…”中，\W+ 与“…”和所有空格匹配。                    |
