簡體   English   中英

SQL Server使用正則表達式從字符串中提取整數

[英]SQL Server extract integers from string using regular expression

我有一個字符串(unc文件路徑),我需要提取一些將以半可預測方式嵌入到字符串中的整數。

字符串示例:

\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip
--OR-- : \\servername\folder1\FTP\folder2\512\862450_FileBundle.zip
--OR-- : servername/folder1/FTP/folder2/512/862450_FileBundle.zip

以下正則表達式正則表達式將與以正斜杠或反斜杠界定的任何整數值匹配: (\\/|\\\\)\\d+(\\/|\\\\)

因此,上面的REGEX將與“ \\ 512 \\”,“ \\ 512 /”,“ / 512 /”甚至“ / 512 \\”匹配。

我嘗試了以下SQL和其他變體而沒有成功:

DECLARE @testString varchar(50) = '\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip'
SELECT PATINDEX('%(\/|\\)\d+(\/|\\)%', @testString)

我對REGEX和SQL並不十分熟悉,所以我什至不確定這是否可行。

SQL Server不具備正則表達式那么好的模式匹配功能。 您可以搜索模式:

[/\\][0-9]%[/\\]

也就是說,斜杠后跟一個數字,后跟任何其他字符串,后跟一個斜杠。 這將匹配第一個數字之后的任何字符,但是您的示例沒有任何形式為/1abc/

如果這足夠了,那就可以了:

select v.*, 
       left(v2.str2, patindex('%[/\\]%', v2.str2) - 1)
from (values ('\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip')) v(str) cross apply
     (values (stuff(v.str, 1, patindex('%[/\\][0-9]%[/\\]%', v.str), ''))) v2(str2)

除了編寫UDF以遍歷字符外,我唯一想到的就是蠻力方法...

(用戶定義函數可能是最差的選擇。)

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=face1befe5e7c74f457846fc37eca649

SELECT
  *,
  SUBSTRING(test.unc_file_path, headMatch.pos+1, headMatch.chars)
FROM
  test
OUTER APPLY
(
  SELECT
    MIN(pos), MIN(chars)
  FROM
  (
    SELECT
      PATINDEX('%' + head + body + tail + '%', test.unc_file_path)  AS pos, chars
    FROM
    (
                 SELECT '\'
       UNION ALL SELECT '/'
    )
      head(head)
    CROSS JOIN
    (
                 SELECT 1, '[0-9]'
       UNION ALL SELECT 2, '[0-9][0-9]'
       UNION ALL SELECT 3, '[0-9][0-9][0-9]'
       UNION ALL SELECT 4, '[0-9][0-9][0-9][0-9]'
       UNION ALL SELECT 5, '[0-9][0-9][0-9][0-9][0-9]'
    )
      body(chars, body)
    CROSS JOIN
    (
                 SELECT '\'
       UNION ALL SELECT '/'
    )
      tail(tail)
  )
    match
  WHERE
    pos > 0
)
  headMatch(pos, chars)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM