Regex在SSMS 2016

yfjy0ee7  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(70)

我在使用ssms 2016。我有一个字符串,它的模式是14Jan22_B_15May23_15_N_323_412_102,我需要从中提取两件事。
1.两个_之间的第一个数字。在这种情况下,它是15,但它可以是任何数字。我尝试了下面的方法,但它没有工作。它返回0

DECLARE @InputString VARCHAR(MAX) = '14Jan22_B_15May23_15_N_323_412_102'; 
DECLARE @MatchPos INT = PATINDEX('%_[0-9]+_%', @InputString);
select @MatchPos
  1. _N__R_之后的所有数字。此外,_N__R_需要在从点1开始的数字之后。因为字母B也可以是字母N。
    我没有开始研究第2点,因为我不知道如何解决第1点
wz8daaqr

wz8daaqr1#

你的尝试中有一些错误,你可能不会马上抓住。其中一个问题是'%_[0-9]+_%'中使用的'_'是单个字符的后缀。第二个问题是15,不是0到9之间的数字,其中你有一个字符搜索一个数字[0-9]
也许不是最干净的,但它有效:

DECLARE @InputString VARCHAR(MAX) = '14Jan22_B_15May23_15_N_323_412_102'; 
DECLARE @MatchPos int = ISNULL(NULLIF(PATINDEX('%[_][0-9][_]%', @InputString),0),PATINDEX('%[_][0-9][0-9][_]%', @InputString))
DECLARE @num int = CHARINDEX('_N_',@InputString,@MatchPos)+3
DECLARE @t nvarchar(MAX) = SUBSTRING(@InputString,@num,LEN(@inputString)-@num)

;WITH CTE AS (
    SELECT 
        REPLACE(LEFT(@t,CHARINDEX('_',@t)),'_','') [NUMBER], 
        CONCAT(REPLACE(@t,LEFT(@t,CHARINDEX('_',@t)),''),'_') [REMAINDER],  
        @t AS [Original Number After @num]
    UNION ALL
    SELECT 
        REPLACE(LEFT([REMAINDER],CHARINDEX('_',[REMAINDER])),'_',''), 
        REPLACE([REMAINDER],LEFT([REMAINDER],CHARINDEX('_',[REMAINDER])),''), 
        @t
    FROM CTE 
    WHERE LEN([REMAINDER])>0
)
SELECT NUMBER AS [Ending Numbers] from CTE
SELECT @MatchPos [MatchPos index], REPLACE(substring(@InputString,@MatchPos,3),'_','') AS [MatchPos Number], @num [_N_ INDEX], SUBSTRING(@InputString,@num,LEN(@inputString)-@num) AS [Numbers After _N_]

相关问题