我正在寻找一个只返回我的表格行的SQL语句,其中Name
字段包含特殊字符(不包括下划线)。
我试过了:
SELECT * FROM 'table' WHERE Name REGEXP '^[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+$'
但是没有骰子,这会返回一个空结果集(尽管我专门添加了包含%, $, and #
个字符的名称字段的行。)
答案 0 :(得分:4)
第一个问题似乎是^
和$
标志(Mike C总结得比我为什么要快......)
但是我也看到了逃避问题:regexp中所有特殊字符应该是转义特别放在[]
中,所以[
,]
,^
,-
以下是关于how to escape special characters inside character groups in MySQL regexes的问题。
结论详见regex documentation:
括号表达式是用“[]”括起来的字符列表。它通常匹配列表中的任何单个字符(但见下文)。
如果列表以'^'开头,则它匹配任何单个字符(但请参阅 下面)不是从列表的其余部分。
如果列表中的两个字符用“ - ”分隔,则这是整理顺序中这两个(包括)之间的全部字符的简写,例如: ASCII中的“[0-9]”匹配任何十进制数字。
两个范围共享端点是非法的(!),例如'高手'。范围依赖于序列依赖,并且可移植程序应该避免依赖它们。
要在列表中包含文字']',请将其设为第一个字符(跟随可能的'^')。
要包含文字“ - ”,请将其设置为范围的第一个orlast字符或第二个端点。
要使用文字“ - ”作为范围的第一个端点,请将其括在'[。'中。和'。''使它成为一个整理元素(见下文)。
除了使用'['(参见下一段)的这些和一些组合外,所有其他特殊字符(包括'\')在其中失去了特殊意义 括号表达。
修改强>
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';
Escaped - &gt;相同???
SELECT * FROM txt WHERE txt
REGEXP 'ab[[\]]+cde';
双重逃避 - &gt;如果不起作用,则组现在为[
和\
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';
答案 1 :(得分:1)
此正则表达式应匹配仅包含特殊字符的名称。您指定表示字符串开头的克拉(^),带有特殊字符列表的字符类,用于表示一个或多个的加号(+),然后用美元表示字符串的结尾。您需要在字符串中考虑非特殊字符。你可以尝试这样的事情:
WHERE Name REGEXP '^.*?[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+.*?$'
我添加了。*?在开头和结尾允许特殊字符前后的非特殊字符。顺便说一下,你可能不再需要(+)了,因为一个特殊的就足够了。