请注意我想在字符串中找到我指定的特殊字符。
DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SELECT PATINDEX('%[^0-9A-Za-z .&()[[,''-]%',@Temp1)
经过长时间的发现,我得到允许左方括号,我们必须放两次[即[[] 但右支架不是这种情况 表达式 PATINDEX('%[^ 0-9A-Za-z。&amp;()[[],'' - ]%',@ Temp1)无法提供预期的正确结果。< / p>
DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SELECT PATINDEX('%[^0-9a-z .&()[[],''-]%',@Temp1)
上面的代码返回patindex 0,因为我删除了大写。它应返回1以匹配'R'。那么什么才是正确的支架。
答案 0 :(得分:3)
根据this link,[[
似乎不是[
的转义,而是[[]
。换句话说,在左右方括号对中的左方括号 。
在这种情况下,您的PATINDEX
应如下所示。
PATINDEX('%[^0-9A-Za-z .&()[[]],''-]%',@Temp1)
请注意自第一个]
关闭]
对以匹配[]
后的额外[
。
编辑#1:
如果你尝试这样的话怎么办?我们正在做的是首先用[]
替换烦人的()
字符,然后搜索不在列表中的特殊字符。
DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SET @Temp1 = REPLACE(@Temp1,'[','(')
SET @Temp1 = REPLACE(@Temp1,']',')')
SELECT PATINDEX('%[^0-9A-Za-z .&(),''-]%',@Temp1)
不幸的是,我目前无法对此进行测试,因为我这一秒没有SQL Server的工作副本。一旦我安装了一个,我会尝试稍微测试一下。
编辑#2:
现在我已经能够测试了,我已经确认这是一个可能的解决方案。
DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]+'
SET @Temp1 = REPLACE(@Temp1,'[','.')
SET @Temp1 = REPLACE(@Temp1,']','.')
SET @Temp1 = REPLACE(@Temp1,'-','.')
SELECT PATINDEX('%[^0-9a-z .&(),'']%',@Temp1 COLLATE Latin1_General_BIN)
有几个挑战需要克服。
COLLATE
来解决这个问题。请注意,我使用了BIN
排序规则,因为即使CS
排序规则也没有按预期运行。这解决了A-Z
上删除R
仍然不匹配的问题。-
表达式中的PATINDEX
字符无效。这可能是因为它是表达式中的特殊字符(即a-z
中的“直通”)。我尝试像--
一样逃避它,虽然这有效,但我的+
的附加测试用例被打破了。我发现这真的很奇怪,但最终决定用-
替换另一个我知道我会拒绝的角色(.
)可能更容易。REPLACE
函数通过完全从表达式中删除有问题的特殊字符,降低了PATINDEX
的复杂性(并使其实际工作)。假设你在PATINDEX
中总是至少有一个你拒绝的角色,那么使用这些REPLACE
表达式应该是一个可行的解决方案。从理论上讲,它会减慢一些事情的速度,但这只需要在现实生活中进行测试,看看它是否重要。我知道这个解决方案有效,因为我已经能够测试它。只需要一点时间就可以启动并运行SQL Server Express Edition!