我正在尝试使用类似模式来验证字符串,该模式仅由以下字符组成,并且我与之接近,但仍然可以绕过我的curernt表达式:
valid characters: numbers 0-9, alphanumeric chars + . = \
表达式:
'%[^[0-9A-Za-z+.\_\-\=\\\]]%' ESCAPE '\'
但是使用该表达式,带方括号和“-”字符的字符串也被视为正确。如果像这样将内括号换成普通括号
'%[^(0-9A-Za-z+.\_\-\=\\\)]%' ESCAPE '\'
我仍然有相同的问题,但是这次使用了中括号。 测试数据:
IF OBJECT_ID('TEMPDB..#temp') IS NOT NULL DROP TABLE #temp
CREATE TABLE #temp(
string varchar(max),
expectedResult varchar(max),
result varchar(max)
)
insert #temp(string,expectedResult)
values
('da)ssdas', 'invalid'),
('DFGHJ§$%', 'invalid'),
('+=8rt8\\//12=+', 'invalid'),
('[BIGBEAR]', 'invalid'),
('BIG-BEAR', 'invalid'),
('x[BIGBEAR]x', 'invalid'),
('(BIGBEAR)', 'invalid'),
('+=8rt8Ahd12=+', 'valid')
update #temp
set result = CASE WHEN string like '%[^[0-9A-Za-z+.\_\-\=\\\]]%' ESCAPE '\'
THEN 'invalid'
ELSE'valid'
END
select * from #temp
结果
string expectedResult result
da)ssdas invalid invalid
DFGHJ§$% invalid invalid
+=8rt8\\//12=+ invalid invalid
[BIGBEAR] invalid valid
BIG-BEAR invalid valid
x[BIGBEAR]x invalid valid
(BIGBEAR) invalid invalid
+=8rt8Ahd12=+ valid valid
答案 0 :(得分:0)
我想你只是想要
'%[^0-9A-Za-z+.\_\-\=\\]%' ESCAPE '\'
字符类中的^
适用于所有字符。为了可读性,我将使用其他转义字符。连字符作为字符类中的第一个字符表示连字符,因此唯一需要转义的字符是反斜杠:
'%[^-0-9A-Za-z+=$\]%' ESCAPE '$'