# 正则表达式概述

正则表达式提供了一种强大的匹配文本模式的方法。你可以在 LIKE 语句中使用简单的通配符（如 %，_），但是正则表达式为你提供了更多的灵活性和匹配选项。

## 使用场景

正则表达式能进行复杂的字符串匹配和操作，以下列举一些常见的使用场景：

- **数据验证**：正则表达式可以用来验证数据是否符合特定的格式，例如检查一个字段是否包含有效的电子邮件地址、电话号码或者社会保障号等。例如，你可以使用正则表达式来找出所有格式不符合规范的电子邮件地址：

    ```sql
    SELECT email
    FROM users
    WHERE email NOT REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$';
    ```

- **数据筛选**：正则表达式可以用来搜索包含或不包含特定模式的数据。例如，如果你想要找出所有以特定前缀开始的电话号码，你可以使用正则表达式来匹配这些号码：

    ```sql
    SELECT phone_number
    FROM users
    WHERE phone_number REGEXP '^180';
    ```

- **数据清洗**：在数据清洗中，正则表达式也非常有用。例如，你可能需要清除字符串中的特殊字符、空格或者提取字符串中的数字等，正则表达式可以很容易地实现这些功能：

    ```sql
    SELECT REGEXP_REPLACE(name, '[^a-zA-Z]', '')
    FROM users;
    ```

    这段 SQL 将会返回 `name` 字段中所有非字母的字符被替换掉的结果。

- **文本分析**：如果你正在进行文本分析，正则表达式可以帮助你找出文本中的特定词汇或短语，甚至可以用来进行某些形式的自然语言处理。

## 特殊字符

正则表达式使用 POSIX（Portable Operating System Interface）扩展正则表达式。下面是一些需要注意的特殊字符：

|字符 | 说明|
|---|---|
| `.`  |  匹配任何单个字符（除了换行符） |
| `*`  | 表示前面的元素可以重复任意次（包括零次）  |
| `+`  |  表示前面的元素可以重复一次或多次。 |
|  `?` |  表示前面的元素可以重复零次或一次。 |
| `{n}`  |  表示前面的元素可以重复 n 次。 |
| `{n,}`  |  表示前面的元素可以重复 n 次或更多次。 |
| `{n,m}`  | 表示前面的元素可以重复 n 次到 m 次。  |
| `^`  | 表示匹配字符串的开始。  |
| `$`  | 表示匹配字符串的结束。  |
| `[abc]`  | 表示匹配 a、b 或 c。  |
| `[^abc]`  | 表示匹配任何不是 a、b 或 c 的字符。  |
| `(abc|def)`  | 表示匹配 abc 或 def。  |
| `\d`  |  表示匹配数字 |
| `\s`  | 表示匹配空白字符  |
| `\w` |  表示匹配单词字符 |
|`\D`、`\S` 和 `\W` |表示匹配相反的字符集|

:::{note}
在正则表达式中，这些特殊字符需要使用 `\` 进行转义，例如 `\\.` 表示匹配一个实际的 `.` 字符，而不是任何字符。
:::
MatrixOne 的正则表达式默认是区分大小写的。如果你希望进行不区分大小写的匹配，可以使用 `REGEXP_LIKE(column, pattern, 'i')` 这样的语法。其中 `i` 表示不区分大小写。

## 参考文档

**正则表达式函数列表**

|名称	| 释义|
|---|---|
|[NOT REGEXP](not-regexp.md)| REGEXP 的否定表达式|
|[REGEXP_INSTR()](regexp-instr.md) |匹配正则表达式的子串起始索引|
|[REGEXP_LIKE()](regexp-like.md)|字符串是否匹配正则表达式|
|[REGEXP_REPLACE()](regexp-replace.md)|替换匹配正则表达式的子字符串|
|[REGEXP_SUBSTR()](regexp-substr.md)|返回匹配正则表达式的子串|
