第一个问题似乎是
^和
$符号(Mike C总结的速度比我为什么要快…)
但是我也看到了转义问题:所有在regexp中表示某些内容的特殊字符都应为 逃脱了 特别是放置在
[],所以
[,
],
^,
-
结论在正则表达式文档中有详细说明:
方括号表达式是用“ []”括起来的字符列表。它通常与列表中的任何单个字符匹配(但请参见下文)。
- 如果列表以“ ^”开头,则它匹配任何单个字符(但请参见下文),而不是列表的其余部分。
*如果列表中的两个字符用’-‘分隔,则这是整理序列中这两个字符之间(包括两个字符)的完整字符的缩写,例如ASCII中的[[0-9]]匹配任何十进制数字。
两个范围共享一个端点是非法的(!),例如’ac-e’。范围非常依赖于序列,并且可移植程序应避免依赖它们。
要在列表中包含文字’]’,请将其设为第一个字符(在可能的’^’之后)。
要包含文字“-”,请使其成为范围的第一个或最后一个字符或第二个端点。
要将文字“-”用作范围的第一个端点,请将其括在“ [。”中。和’。]’使其成为整理元素(请参见下文)。
除了这些以及使用’[‘的某些组合(请参阅下一段)之外, 所有其他特殊字符(包括’')在方括号表达式内都失去其特殊意义 。
编辑
这是有关该
]字符的一些有趣正则表达式的SQL小提琴
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';
两次转义->不起作用,组现在是a
[和a
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';



