Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex TSQL允许右方括号也与字符串匹配_Regex_Tsql - Fatal编程技术网

Regex TSQL允许右方括号也与字符串匹配

Regex TSQL允许右方括号也与字符串匹配,regex,tsql,Regex,Tsql,请注意,我想在字符串中找到我指定的以外的特殊字符 DECLARE @Temp1 NVARCHAR(100) SET @Temp1 ='Rajesh[sdf]' SELECT PATINDEX('%[^0-9A-Za-z .&()[[,''-]%',@Temp1) 经过长时间的寻找,我得到了允许左方括号的结果,我们必须放两次[e[[ 但右括号中的情况并非如此 表达式PATINDEX('%[^0-9A-Za-z.&()[[],'-]%,@Temp1)未给出预期的正确结果 DECLARE

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

DECLARE @Temp1 NVARCHAR(100)
SET @Temp1 ='Rajesh[sdf]' 
SELECT PATINDEX('%[^0-9A-Za-z .&()[[,''-]%',@Temp1)
经过长时间的寻找,我得到了允许左方括号的结果,我们必须放两次[e[[ 但右括号中的情况并非如此 表达式PATINDEX('%[^0-9A-Za-z.&()[[],'-]%,@Temp1)未给出预期的正确结果

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

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

根据,看起来
[[
不是
[
的转义,而是
[[[]
。换句话说,左方括号对中的左方括号

在这种情况下,您的
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\u Latin1\u General\u CP1\uCI\u AS)。我需要使用
    COLLATE
    来解决这个问题。请注意,我使用了
    BIN
    排序规则,因为即使是
    CS
    排序规则也没有按照预期的方式运行。这修复了删除
    A-Z
    仍然与
    R
    不匹配的问题
  • 原始
    PATINDEX
    表达式中的
    -
    字符工作不正常。这可能是因为它是表达式中的特殊字符(即
    a-z
    中的“through”)。我试着像
    -
    那样转义它,但当它起作用时,我的
    +
    附加测试用例被破坏了。我发现这真的很奇怪,但最终决定用另一个我知道要拒绝的字符(
    )替换
    -
    可能更容易些
  • 字符串
    REPLACE
    函数降低了
    PATINDEX
    的复杂性(并使其实际工作)通过从表达式中完全删除有问题的特殊字符。假设您在
    PATINDEX
    中始终至少有一个要拒绝的字符,使用这些
    REPLACE
    表达式应该是一个可行的解决方案。从理论上讲,这会使速度减慢一点,但这只是需要在看看这是否重要

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

SET@Temp1='Rajesh[sdf]'的结果选择PATINDEX('%[^0-9a-z.&()[[[]],'-]%,@Temp1)不匹配R,因为我删除了A-Z。我想我很困惑。您是想匹配
R
还是
]
?如果您从字符类(
A-Z
)中删除大写字符,那么它不应该匹配
R
。在这种情况下,它似乎工作正常。它匹配
]
?现在我看到了
^
…我现在明白你想要什么了。很抱歉我的误解。我正在尝试重现这个问题,但还没有任何运气。选择PATINDEX('%[^0-9A-Za-z.&(),'-]','Jaiprakash Hydro Power Ltd.[以前]')返回29个SELECT PATINDEX('%[^0-9A-Za-z.&(),['-]','Jaiprakash Hydro Power Ltd.[以前])]“)返回39,即方括号位置,但选择PATINDEX(“%[^0-9A-Za-z.&(),]'''-]%,“Jaiprakash Hydro Power Ltd.[以前]”)或选择PATINDEX(“%[^0-9A-Za-z.&(),[]'-]%,“Jaiprakash Hydro Power Ltd.[以前]”)不返回左方括号位置。顺便说一句:如果您只想在SQL Server、Oracle、Postgres、MySQL上快速测试某些内容,可以使用iif…“因为我已经删除了大写字母。它应该返回1”。除了二进制排序规则外,这是不正确的。在不区分大小写的排序规则中,
a-z
也匹配大写字母。在区分大小写的排序规则中,
a-z
匹配除
z
以外的所有字母。也不必将左方括号对折。
选择PATINDEX(“[]”,“[]”)
返回
1
,如果要将
-
包含在集合中,这需要是第一个字符。不确定如何转义
]
但目前…您正在搜索的一些字符具有连续字符代码,因此您可以进行4个范围匹配,只剩下一个松散字符
PATINDEX('[0-9A-Z&-),-.[]',@Temp1 COLLATE 1_General_100_BIN)
不幸的是
]
不在任何范围内,因此仍无法处理。似乎无法使用
PATINDEX
[]
组中转义
]
。此处有一个请求已关闭,无法修复。