首页 > 解决方案 > SQL Server 使用正则表达式从字符串中提取整数

问题描述

我有一个字符串(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+(\/|\\)

所以上面的正则表达式会匹配“\512\”、“\512/”、“/512/”甚至“/512\”。

我尝试了以下 SQL 和其他变体但没有成功:

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

我对 REGEX 和 SQL 不是很熟悉,所以我什至不确定这是可能的。

标签: sqlsql-serverregexmatching

解决方案


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)

推荐阅读