SQL 匹配特殊字符正则表达式

Posted

技术标签:

【中文标题】SQL 匹配特殊字符正则表达式【英文标题】:SQL Match Special Characters Regexp 【发布时间】:2013-01-30 13:04:36 【问题描述】:

我正在寻找一条 SQL 语句,它只返回我的表中 Name 字段包含特殊字符(不包括下划线)的行。

我试过了:

SELECT * FROM 'table' WHERE Name REGEXP '^[!#$%&()*+,\-./:;<=>?@[\\\]^`|~]+$'

但没有骰子,这会返回一个空的结果集(尽管我专门添加了包含 %, $, and # 字符的名称字段的行)。

【问题讨论】:

在此处查看示例:***.com/questions/9604727/… 【参考方案1】:

第一个问题似乎是 ^$ 标志(Mike C 总结得比我更快,为什么......)

但我也看到了转义问题:所有在正则表达式中表示某些含义的特殊字符都应该转义专门放在[]中,所以[]^、@ 987654331@

这是一个关于how to escape special characters inside character groups in mysql regexes的问题。

结论详见regex documentation:

括号表达式是包含在“[]”中的字符列表。它通常匹配列表中的任何单个字符(但见下文)。

如果列表以 '^' 开头,它匹配任何单个字符(但请参阅 下面)不是来自列表的其余部分。

如果列表中的两个字符用“-”分隔,这是整理序列中这两个(包括)之间的全部字符范围的简写,例如 ASCII 中的“[0-9]”匹配任何十进制数字。

两个范围共享一个端点是非法的(!),例如'高手'。范围非常依赖于排序顺序,可移植程序应避免依赖它们。

要在列表中包含文字“]”,请将其设为第一个字符(可能位于“^”之后)。

若要包含文字“-”,请将其设为第一个或最后一个字符,或范围的第二个端点。

要将文字“-”用作范围的第一个端点,请将其括在“[.”中和 '.]' 使其成为整理元素(见下文)。

除了这些和一些使用“[”的组合(见下一段),所有其他特殊字符,包括“\”,在 括号表达式

编辑 Here is an SQL fiddle 关于] 字符的一些有趣的正则表达式

DDL: 创建表 txt ( txt varchar(200) );

insert into txt values ('ab[]cde');
insert into txt values ('ab[cde');
insert into txt values ('ab]cde');
insert into txt values ('ab[]]]]cde');
insert into txt values ('ab[[[[]cde');
insert into txt values ('ab\\]]]]cde');
insert into txt values ('ab[wut?wut?]cde');

查询:

匹配一组[] 字符的简单方法。语法上没问题,但该组是单个 [ 字符,然后匹配多个 ] 字符。

SELECT * FROM txt WHERE txt 
REGEXP 'ab[[]]+cde';

转义 -> 相同 ???

SELECT * FROM txt WHERE txt 
REGEXP 'ab[[\]]+cde';

双重转义 -> 不起作用,组现在是 [\

SELECT * FROM txt WHERE txt 
REGEXP 'ab[[\\]]+cde';

在组内用左括号交换右括号。这是我写过的最奇怪的正则表达式 - 到目前为止......

SELECT * FROM txt WHERE txt 
REGEXP 'ab[][]+cde';

我会在一个奇怪的噩梦中被这样一个(完全有效的!)正则表达式杀死,我想:

SELECT * FROM txt WHERE txt 
REGEXP 'ab[]wut?[]+cde';

【讨论】:

感谢 ppeterka,+1 提出了所需的转义问题 @MikeC 我对此有部分错误,尝试编写一个 SQL 小提琴,并在这个主题中发现了有趣的结果,我将其添加到我的答案中......非常奇怪,我确信他们可以合理地逃脱了,但我无法让] 表现...这是它的小提琴:sqlfiddle.com/#!2/bfc4c/3【参考方案2】:

此正则表达式应匹配仅包含特殊字符的名称。您指定表示字符串开头的克拉 (^)、带有特殊字符列表的字符类、表示一个或多个的加号 (+),然后指定表示字符串结尾的美元。您需要考虑字符串中的非特殊字符。你可以试试这样的:

WHERE Name REGEXP '^.*?[!#$%&()*+,\-./:;<=>?@[\\\]^`|~]+.*?$'

我添加了 .*?在开始和结束时允许在特殊字符之前和之后使用非特殊字符。顺便说一句,您可能不再需要 (+) 了,因为一场比赛就足够了。

【讨论】:

以上是关于SQL 匹配特殊字符正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配指定字符开始和指定字符结束?

正则表达式特殊符号及用法

正则表达式 .*+ 匹配啥?

正则表达式如何匹配+号?

正则表达式[!^0-9] 是啥意思?

4-19 Linux中的正则表达式 --- 字符匹配