TSQL中用于匹配给定参数内容的正则表达式不工作



我试图检查SP中给定的参数是否有资格使用,并且我有以下REGEX:

[a-zA-Z][a-zA-Z]d{4}|[a-hA-H]d{3}|[j-mqrtvwzJ-MQRTVWZ]d{4}

它应该查找像xx9999和x999这样的条目的匹配项。我在https://regex101.com/测试了它,它工作得很好。

然而,我没有设法使它在TSQL中工作。我的测试代码:

declare @param varchar(max) = 'xx1234'
-- try 1
select 'match' where @param like '[a-zA-Z][a-zA-Z]d{4}|[a-hA-H]d{3}|[j-mqrtvwzJ-MQRTVWZ]d{4}'
-- try 2
select patindex('[a-zA-Z][a-zA-Z]d{4}|[a-hA-H]d{3}|[j-mqrtvwzJ-MQRTVWZ]d{4}',@param)

任何想法?

如果有人有同样的情况,我发现了这个问题,并提出了解决方案。

令我困惑的是,我之前已经成功地使用了PATINDEX和REGEX进行类似的检查,所以我不知道为什么这个不工作。

长话短说,我注意到,由于某种原因,TSQL只能识别非常简单的REGEX,而我试图使用的是一种太"复杂"(尽管它是正确的)。

我最后意识到问题出在d{n}斜杠(或操作)。为了修复它,我替换了d{n}[0-9]并在随后的三个测试中'破坏' REGEX,如下所示:

DECLARE @param varchar(max) = 'ab1234'
IF PATINDEX('[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9]', @param) = 0
AND PATINDEX('[a-hA-H][0-9][0-9][0-9]', @param) = 0
AND PATINDEX('[j-mqrtvwzJ-MQRTVWZ][0-9][0-9][0-9][0-9]', @param) = 0
SELECT '0'
ELSE
SELECT '1'

正常工作

DECLARE @param varchar(max) = 'xx1234'
SELECT CASE WHEN @param LIKE '[a-zA-Z]%[1-9]' THEN 1 ELSE 0 END

最新更新