MySQL 正则表达式

MySQL REGEXP_LIKE() 函数用于执行正则表达式匹配。如果string与pattern指定的正则表达式匹配,则返回1,否则返回0。如果string或pattern> 为 NULL,则返回值为 NULL。

默认情况下,正则表达式操作使用 string 和 pattern 参数的字符集和排序规则在确定字符类型并进行比较时。如果参数具有不同的字符集或排序规则,则适用强制规则。可以使用显式排序指示符指定参数以更改比较行为。

语法

REGEXP_LIKE(string, pattern, match_type) 

参数

string必填。 指定要搜索的字符串。
pattern必填。 指定正则表达式匹配信息。请参阅下表了解模式语法。
match_type可选。 指定如何执行匹配。它可以采用以下值:
  • c -  区分大小写的匹配
  • i -  不区分大小写的匹配
  • m -  多行模式。识别字符串中的行终止符。默认行为是仅在字符串表达式的开头和结尾匹配行终止符
  • n -  .字符与行终止符匹配。默认值为 .匹配在行尾停止
  • u -  仅限 Unix 的行结尾。仅换行符被识别为以 .、^ 和 $ 匹配运算符结尾的行

正则表达式模式

符号描述
^匹配字符串的开头。
$匹配字符串的结尾字符串。
*匹配零次或多次出现。
+匹配一次或多次出现。
?匹配零次或一次出现。
.匹配除 NULL 之外的任何字符。
|像"OR"一样使用来指定多个替代字符。
[ ]匹配 [] 内指定的任何单个字符。
[^ ]匹配 [] 内未指定的任何单个字符。
-表示字符范围。
( )用于将表达式分组为子表达式。
{m}匹配 m
{m,}匹配至少 m 次。
{m,n}匹配至少 m 次,但不超过 n 次。
\nn 是 1 到 9 之间的数字。匹配找到的第 n 个子表达式在 ( ) 内遇到 \n 之前。
\d匹配数字字符。
\D匹配非数字字符。
\w匹配单词字符。
\W匹配非单词字符。
\s匹配空白字符。
\s匹配空白字符。
\S匹配非空白字符。
*?匹配前面的模式出现零次或多次。
+?匹配前面的模式出现一次或多次。
??匹配前面的模式零次或一次出现。
?匹配前面的模式n 次。
?与前面的模式匹配至少 n 次。
?匹配前面的模式至少 n 次,但不超过 m 次。
[..]匹配一种排序规则可以是多个字符的元素。
[=character_class=]表示一个等价类。它匹配具有相同排序值的所有字符,包括其自身。
[:character_class:]表示匹配属于该字符的所有字符的字符类

标准类名称列表

字符类名称含义
alnum字母数字字符
alpha字母字符
blank空白字符
cntrl控制字符
digit数字字符
graph图形字符
lower小写字母字符
print图形或空格字符
punct标点符号
space空格、制表符、换行符和回车符
upper大写字母字符
xdigit十六进制数字字符

示例:REGEXP_LIKE() 示例

下面的示例显示了REGEXP_LIKE()函数的用法。

mysql> SELECT REGEXP_LIKE('dog cat dog', 'dog');
Result: 1

mysql> SELECT REGEXP_LIKE('aa aaa aaaa', 'a{4}');
Result: 1

mysql> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE');
Result: 1

mysql> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE' COLLATE utf8mb4_0900_as_cs);
Result: 0 

示例:区分大小写的搜索

可以将match_type参数指定为c以执行区分大小写的搜索。如果任一参数是二进制字符串,则即使 match_type 包含 i 字符,也会以区分大小写的方式处理参数。请参阅下面的示例:

mysql> SELECT REGEXP_LIKE('XYZ','y');
Result: 1

/* case-sensitive search */
mysql> SELECT REGEXP_LIKE('XYZ', 'y', 'c');
Result: 0

/* case-insensitive search */
mysql> SELECT REGEXP_LIKE('XYZ', 'y', 'i');
Result: 1

/* using (?-i) pattern for case-sensitive search */
mysql> SELECT REGEXP_LIKE('XYZ','(?-i)y');
Result: 0 

示例:匹配多个替代项

考虑一个名为Employee的表。以下查询用于从此表中获取 Name 包含"Ja"、"Je"或"Ji"的所有记录。要为模式的第二个字符指定多个替代字符,请使用 |

SELECT * FROM Employee
WHERE REGEXP_LIKE(Name, 'J(a|e|i)'); 

示例:匹配开始

考虑一个名为Employee 的表。下面的查询用于从该表中获取 Name 以"J"开头的所有记录。这里,^ 用于指定模式的起始字符。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Name, '^J'); 

示例:结尾匹配

考虑一个名为Employee的表。以下查询用于从此表中获取 Name 以"n"结尾的所有记录。这里,$用于指定模式的结束字符。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Name, 'n$'); 

示例:匹配列表

考虑一个名为 Employee 的表。以下查询用于从此表中获取 Name 包含"Ja"、"Jb"、"Jc"或"Jd"的所有记录。要指定模式的第二个字符,请使用 [  ],在本例中可以是"a"、"b"、"c"或"d"。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Name, 'J[a-d]'); 

示例:非匹配列表

考虑一个名为Employee的表。以下查询用于从此表中获取 Name 不包含"Ja"、"Jb"、"Jc"或"Jd"的所有记录。 [ ^ ] 模式用于指定此处未列出的字符。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Name, 'J[^a-d]'); 

示例:匹配字符类

考虑一个名为 Employee 的表。以下查询用于从此表中获取所有记录,其中 Address 包含以 123 开头的模式,其余字符为字母数字字符。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Address, '123[[:alnum:]]*'); 

示例:转义字符

要在使用 REGEXP 函数时转义特殊字符,特殊字符前面应有两个反斜杠 \\。考虑一个名为 Employee 的表。下面的查询可用于获取该表中 Address 包含 ( 字符的所有记录。

SELECT * FROM Employee
WHERE REGEXP_LIKE(Address, '\\(');