MariaDB REGEXP_SUBSTR() 函数返回与 pattern 指定的正则表达式匹配的 string 的子字符串。如果没有匹配则返回 NULL。如果字符串或模式为NULL,则返回值为NULL。
默认情况下,REGEXP_SUBSTR() 函数执行不区分大小写的匹配,除非与二进制字符串一起使用。
语法
REGEXP_SUBSTR(string, pattern)
参数
string | 必填。 指定要搜索的字符串。 |
pattern | 必填。 指定正则表达式匹配信息。请参阅下表了解模式语法。 |
正则表达式模式
符号 | 描述 |
---|---|
^ | 匹配字符串的开头。 |
$ | 匹配字符串的结尾字符串。 |
* | 匹配零次或多次出现。 |
+ | 匹配一次或多次出现。 |
? | 匹配零次或一次出现。 |
. | 匹配除 NULL 之外的任何字符。 |
| | 像"OR"一样使用来指定多个替代字符。 |
[ ] | 匹配 [] 内指定的任何单个字符。 |
[^ ] | 匹配 [] 内未指定的任何单个字符。 |
- | 表示字符范围。 |
( ) | 用于将表达式分组为子表达式。 |
{m} | 匹配 m |
{m,} | 匹配至少 m 次。 |
{m,n} | 匹配至少 m 次,但不超过 n 次。 |
\n | n 是 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 | 小写字母字符 |
图形或空格字符 | |
punct | 标点符号 |
space | 空格、制表符、换行符和回车符 |
upper | 大写字母字符 |
xdigit | 十六进制数字字符 |
示例:REGEXP_SUBSTR() 示例
下面的示例显示了REGEXP_SUBSTR()函数的用法.
SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
Result: 'abc'
REGEXP_SUBSTR('ab123cd','[0-9]+');
Result: '123'
示例:区分大小写搜索
使用此功能时,MariaDB 中有很多方法可以用于区分大小写搜索。请参阅下面的示例:
SELECT REGEXP_SUBSTR('ABC','b');
Result: B
/* 使用 COLLATE 将字符串转换为二进制字符串 */
SELECT REGEXP_SUBSTR('ABC' COLLATE utf8_bin,'b');
Result: NULL
/* 使用 BINARY 将字符串转换为二进制字符串 */
SELECT REGEXP_SUBSTR(BINARY'ABC','b');
Result: NULL
/* 使用 (?-i) 模式强制区分大小写 */
SELECT REGEXP_SUBSTR('ABC','(?-i)b');
Result: NULL
/* 强制搜索不区分大小写 */
SELECT REGEXP_SUBSTR('ABC' COLLATE utf8_bin,'(?i)b');
Result: B
/* 强制搜索不区分大小写 */
SELECT REGEXP_SUBSTR('ABC' COLLATE utf8_bin,'(?+i)b');
Result: B
示例:匹配多个替代项
考虑一个名为 Employee 的数据库表,其中包含以下记录:
EmpID | Name | City | Age |
---|---|---|---|
1 | John Smith | London | 25 |
2 | Marry Knight | New York | 24 |
3 | Jo Williams | Paris | 27 |
4 | Smith Fischer | Amsterdam | 30 |
5 | Aman Gupta | New Delhi | 28 |
下面的查询用于获取Name列记录中的第一个元音。要在模式中指定多个替代方案,请使用 |。
SELECT *,
REGEXP_SUBSTR(Name, 'a|e|i|o|u') AS First_Vowel
FROM Employee
这将产生类似于以下内容的结果:
EmpID | Name | City | Age | First_Vowel |
---|---|---|---|---|
1 | John Smith | London | 25 | o |
2 | Marry Knight | New York | 24 | a |
3 | Jo Williams | Paris | 27 | o |
4 | Smith Fischer | Amsterdam | 30 | i |
5 | Aman Gupta | New Delhi | 28 | A |
示例:单词匹配
考虑上面讨论的表格。以下查询用于从 Name 列中获取第一个单词(名字)。要指定字符范围,请使用 [ ]
SELECT *,
REGEXP_SUBSTR(Name, '[a-z]+') AS FirstName
FROM Employee
这将产生类似于以下内容的结果:
EmpID | Name | City | Age | FirstName |
---|---|---|---|---|
1 | John Smith | London | 25 | John |
2 | Marry Knight | New York | 24 | Marry |
3 | Jo Williams | Paris | 27 | Jo |
4 | Smith Fischer | Amsterdam | 30 | Smith |
5 | Aman Gupta | New Delhi | 28 | Aman |