我正面临着正则表达式区分大小写的问题。在正则表达式表达式中,只有第一项在方括号内起作用。
create table
(
FlowerId varchar(7)
constraint chk_flid_regex
check(ActorId like'[A-Z][a-z][A-Z]' collate sql_latin1_general_CP1_CS_AS)
);
EG。如果我给这样的东西 '[A-Z] [A-Z] [A-Z]' 服务器仅检查第一个[A-Z]。未检查第三个[A-Z]。
因此,如果我插入像'Abc'这样的值,那么它实际上不会插入到表中。然而,它没有给出任何错误。它应该只接受像'AbC'这样的字符。
答案 0 :(得分:3)
虽然我无法解释为什么CS排序规则不起作用,但切换到二进制排序规则似乎与您期望的一样,至少在Sql Server 2008中是这样的:
create table tbl
(
FlowerId varchar(7)
constraint chk_flid_regex
check(FlowerId like'[A-Z][a-z][A-Z]' collate Latin1_General_BIN)
);
答案 1 :(得分:1)
您不能使用范围表格,您必须展开您想要使用的所有字母:
create table
(
FlowerId varchar(7)
constraint chk_flid_regex
check(ActorId like'[ABCDEFGHIJKLMNOPQRSTUVWXYZ][abcdefghijklmnopqrstuvwxyz][ABCDEFGHIJKLMNOPQRSTUVWXYZ]' collate sql_latin1_general_CP1_CS_AS)
);
或切换到二进制排序规则。为什么?因为在大多数排序规则中,小写字母放在大写字母之间,在大写字母之前或之后。所以范围A-Z
扩展为AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZ
- 您排除的所有内容都是小写的z
。
(我希望每次我必须在上面输入时,我的字母表都正确,但您可能需要仔细检查我没有错过任何字母)
答案 2 :(得分:0)
^[A-Z][a-z][A-Z]$
添加锚以禁止部分匹配。