SQL Server使用正则表达式从字符串中提取整数

时间:2018-12-04 17:36:52

标签: sql sql-server regex matching

我有一个字符串(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并不十分熟悉,所以我什至不确定这是否可行。

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

除了编写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)