正则表达式工具 |
grep |
语言和函数库 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
数据库 |
MySQL |
Oracle |
PostgreSQL |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
取代字符串教学 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
MySQL 正则表达式与 REGEXP 算子
MySQL 对正则表达式的支持相当有限,但仍然非常有用。MySQL 仅有一个算子可让您使用正则表达式。这是 REGEXP 算子,其运作方式就像 LIKE 算子,只不过它不使用 _
和 %
通配符,而是使用 POSIX 扩展正则表达式 (ERE)。尽管标准名称中含有「延伸」,但 POSIX ERE 风格在现代标准中是一种相当基本的正则表达式风格。尽管如此,它让 REGEXP 算子比简单的 LIKE 算子强大且灵活许多。
LIKE 和 REGEXP 算子之间的一个重要差异是,只有当样式与整个字符串相符时,LIKE 算子才会传回 True。例如,WHERE testcolumn LIKE 'jg'
只会传回 testcolumn 与 jg
相同的列,除了可能大小写不同。另一方面,WHERE testcolumn REGEXP 'jg'
会传回 testcolumn 在字符串中任何位置都有 jg
的所有列。使用 WHERE testcolumn REGEXP '^jg$'
仅取得与 jg
相同的栏。等同于 WHERE testcolumn LIKE 'jg%'
的会是 WHERE testcolumn REGEXP '^jg'
。不需要在正则表达式的结尾加上 .*
(REGEXP 等同于 LIKE 的 %
),因为接受部分相符。
MySQL 不提供任何 相符模式。POSIX ERE 不支持正则表达式内的模式修改器,而 MySQL 的 REGEXP 算子不提供在正则表达式外指定模式的方式。点 会相符所有字符,包括换行符,而 插入符号和美元符号 仅会在字符串的最开始和最后相符。换句话说:MySQL 将换行字符视为一般字符。如果数据表的校对是大小写不敏感的,则 REGEXP 算子会以大小写不敏感的方式套用正则表达式,这是默认值。如果您将校对变更为大小写敏感,则 REGEXP 算子会变成大小写敏感。
请记住,MySQL 支持字符串中的 C 式转义串行。尽管 POSIX ERE 不支持 \n
等代码来比对换行等不可打印字符,MySQL 却支持字符串中的此转义。因此,WHERE testcolumn REGEXP '\n'
会传回 testcolumn 中包含换行的所有列。MySQL 会在剖析正则表达式之前,将字符串中的 \n
转换成单一换行字符。这也表示反斜线需要转义。比对单一反斜线的正则表达式 \\
在 MySQL 字符串中会变成 '\\\\'
,而比对美元符号的正则表达式 \$
在 MySQL 字符串中会变成 '\\$'
。这与其他数据库(例如 Oracle)不同,后者不支持 \n
,也不需要转义反斜线。
若要传回字段与正则表达式不符的列,请使用 WHERE testcolumn NOT REGEXP 'pattern'
。RLIKE 算子是 REGEXP 算子的同义词。WHERE testcolumn RLIKE 'pattern'
和 WHERE testcolumn NOT RLIKE 'pattern'
与 WHERE testcolumn REGEXP 'pattern'
和 WHERE testcolumn NOT REGEXP 'pattern'
相同。我建议您使用 REGEXP 而非 RLIKE,以避免与 LIKE 算子混淆。
LIB_MYSQLUDF_PREG
如果您想要在数据库中拥有更强大的正则表达式,可以考虑使用 LIB_MYSQLUDF_PREG。这是一个 MySQL 用户函数的开放原代码函数库,用于导入 PCRE 函数库。LIB_MYSQLUDF_PREG 仅以原代码形式提供。若要使用它,您需要能够将其编译并安装到您的 MySQL 服务器中。安装此函数库不会以任何方式变更 MySQL 内置的正则表达式支持。它仅提供下列其他函数
PREG_CAPTURE 从字符串中萃取正则表达式比对。PREG_POSITION 传回正则表达式比对字符串的位置。PREG_REPLACE 对字符串运行搜索并取代。PREG_RLIKE 测试正则表达式是否比对字符串。
所有这些函数都将正则表达式作为其第一个参数。此正则表达式必须格式化为 Perl 正则表达式操作符。例如,要测试 regex
是否与主旨不分大小写地匹配,您会使用 MySQL 代码 PREG_RLIKE('/regex/i', subject)
。这类似于 PHP 的 preg 函数,它也需要 PHP 字符串内正则表达式的额外 // 分隔符号。