TSQL允许匹配右方括号也来自字符串

时间:2012-12-17 14:48:13

标签: regex tsql

请注意我想在字符串中找到我指定的特殊字符。

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'。那么什么才是正确的支架。

1 个答案:

答案 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)

有几个挑战需要克服。

  • 我的数据库的代码页不区分大小写(SQL_Latin1_General_CP1_ CI _AS)。我需要使用COLLATE来解决这个问题。请注意,我使用了BIN排序规则,因为即使CS排序规则也没有按预期运行。这解决了A-Z上删除R仍然不匹配的问题。
  • 原始-表达式中的PATINDEX字符无效。这可能是因为它是表达式中的特殊字符(即a-z中的“直通”)。我尝试像--一样逃避它,虽然这有效,但我的+的附加测试用例被打破了。我发现这真的很奇怪,但最终决定用-替换另一个我知道我会拒绝的角色(.)可能更容易。
  • 字符串REPLACE函数通过完全从表达式中删除有问题的特殊字符,降低了PATINDEX的复杂性(并使其实际工作)。假设你在PATINDEX中总是至少有一个你拒绝的角色,那么使用这些REPLACE表达式应该是一个可行的解决方案。从理论上讲,它会减慢一些事情的速度,但这只需要在现实生活中进行测试,看看它是否重要。

我知道这个解决方案有效,因为我已经能够测试它。只需要一点时间就可以启动并运行SQL Server Express Edition!