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 匹配特殊字符正则表达式的主要内容,如果未能解决你的问题,请参考以下文章