sql - 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 不是很熟悉,所以我什至不确定这是可能的。
解决方案
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)
推荐阅读
- c# - C# :OnvifClientPTZ
- oauth-2.0 - Azure AD B2C 是否支持 OAuth 2.0 SAML 不记名断言流?
- payment-gateway - 如何在 razorpay 支付过程中禁用手机、电子邮件
- c# - 在对依赖于它的标记扩展进行单元测试时,如何设置 StaticResourceExtension?
- javascript - 'npm run test' 有效,但 'jest --coverage' 命令不起作用
- excel - 从 Excel 中打开访问表单中的特定记录
- java - 如何在值 90 后使子字符串 +1
- redis - 如果 redis 是单线程的,为什么我们需要 redis 中的 eval 命令?
- r - 如何提取数字(X>=0)
- javascript - 在javascript中循环两个数组