gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:14:33 26 4
gpt4 key购买 nike

请注意,我想在字符串中查找我指定以外的特殊字符。

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SELECT PATINDEX('%[^0-9A-Za-z .&()[[,''-]%',@Temp1)

经过长时间的发现,我得到了允许左方括号我们必须放两次 [ 即 [[但这不是右括号的情况表达式 PATINDEX('%[^0-9A-Za-z .&()[[],''-]%',@Temp1) 没有给出预期的正确结果。 p>

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]'
SELECT PATINDEX('%[^0-9a-z .&()[[],''-]%',@Temp1)

上面的代码返回 patindex 0 因为我已经删除了大写字母。对于“R”的匹配,它应该返回 1。那么什么是右括号的正确匹配。

最佳答案

根据 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 中的“through”)。我尝试像 -- 一样转义它,虽然这有效,但我的附加测试用例 + 被破坏了。我发现这真的很奇怪,但最终决定将 - 替换为另一个我知道我会拒绝的字符 (.) 可能更容易。
  • 字符串 REPLACE 函数通过从表达式中完全删除有问题的特殊字符来降低 PATINDEX 的复杂性(并使其真正起作用)。假设您在 PATINDEX 中始终至少有一个要拒绝的字符,那么使用这些 REPLACE 表达式应该是一种可行的解决方案。从理论上讲,它会稍微减慢速度,但这只是必须在现实生活中进行测试才能确定它是否重要。

我知道这个解决方案有效,因为我已经能够对其进行测试。只需要一点时间来启动和运行 SQL Server Express Edition!

关于regex - TSQL 也允许匹配来自字符串的右方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com