SQL Server Replace函数中的Regex



我有一个带有随机文本的变量,比如

DECLARE @sNumberFormat NVARCHAR(200) = 'rand{text.here,{999}also-Random9He8re'

我想用[0-9]替换{999}中的每个9。所以在这个例子中,我想得到

'rand{text.here,[0-9][0-9][0-9]also-Random9He8re'

问题是我永远不知道括号里会放多少9,所以可以有{99}{9999}。。然后继续。我还需要验证是否有任何无效字符(不是9(,那么不应该替换任何字符。

我尝试过REPLACEPATINDEX函数的一些组合,但我无法实现。

如果没有强大的正则表达式支持,SQL Server的本机函数在这里没有太多帮助。有一种方法有点麻烦,就是将输入字符串分为三个部分:

rand{text.here,
{999}
also-Random9He8re

接下来,将中间目标子字符串中的9替换为@,或其他一些您不希望出现在输入字符串中其他任何位置的字符:

rand{text.here,
{@@@}
also-Random9He8re

最后,用[0-9]替换中间子串中的@,然后连接在一起得到最终结果:

DECLARE @val NVARCHAR(200) = 'rand{text.here,{999}also-Random9He8re'
SELECT REPLACE(
SUBSTRING(@val, 1, CHARINDEX('{9', @val) - 1) +
REPLACE(SUBSTRING(@val,
CHARINDEX('{9', @val) + 1,
CHARINDEX('9}', @val) - CHARINDEX('{9', @val)), '9', '@') +
SUBSTRING(@val, CHARINDEX('9}', @val) + 2, LEN(@val) - CHARINDEX('9}', @val)),
'@', '[0-9]');

所以我的懒惰开发人员建议这样做:

SELECT Replace(
Replace(
Replace(
Replace(@input, '{9999}', '[0-9][0-9][0-9][0-9]')
, '{999}', '[0-9][0-9][0-9]')
, '{99}', '[0-9][0-9]')
, '{9}', '[0-9]') AS result
;

只要你想进行一次性替换,你就可以继续延长。

快。易于理解的可扩展黑客

有时懒惰就足够了。

这可以通过CTE系列来完成。它与任意数量的";9〃;方括号中的值。

Declare @str varchar(max) = 'rand{text.here,{999}also-Random9He8re';
With A As 
(Select 1 As Pos
Union All 
Select Pos+1 As Pos From A Where Pos < LEN(@str)
),
B As (
Select STRING_AGG(Case When Chr Like '[{9}]' Then Chr Else ' ' End, '') As Chr 
From A Cross Apply (Select SUBSTRING(@str,A.Pos,1 )) As T(chr)
),
C As (
Select [value] As pattern, 
REPLACE(REPLACE(REPLACE([value], '9', '[0-9]'),'{',''),'}','') As replacement, 
ROW_NUMBER() Over (ORDER BY (SELECT NULL)) As Num, 
COUNT(*) OVER (ORDER BY (SELECT NULL)) As Cnt
From B Cross Apply STRING_SPLIT(Chr,' ')
Where [value] Like '{%}' And [value] Like '%9%'
),
D As (
Select @str As Result, 1 As Num
Union All 
select REPLACE(Result, C.pattern, C.replacement) As Res , D.Num+1 As Num
From D Inner Join C On (D.Num=C.Num)
Where D.Num<=C.Cnt)
Select Top 1 Result
From D
Order by Num Desc
  • A-获取文本中的字符位置列表
  • B-获取包含空格而非字符的文本"9","{","}">
  • C-获取模式和相应的替换值
  • D-使用REPLACEMENT函数获取结果

最新更新