我可以在 SQL Server 2014 中使用正则表达式捕获组吗?
Can I use regex capturing groups in SQL Server 2014?
我在 SQL Server 2014 table 中有一些文本数据,我想在其中检测复杂的模式并在文本与模式匹配时提取文本的某些部分。因此,我需要捕获组。
例如
来自正文
"Some title, Some Journal name, vol. 5, p. 20-22"
我要抢卷号
, vol\. ([0-9]+), p\. [0-9]+
请注意,我已经简化了这个用例以提高可读性。上述用例 可以 在不捕获组的情况下解决。实际用例处理更多异常,例如:
- journal/title包含"vol."。
- 包含字母
的卷numbers/pages
- "vol" 后跟“:”或“;”而不是“.”
- ...
我实际使用的正则表达式如下(然而,这不是关于正则表达式结构的问题,只是详细说明为什么我需要捕获组)。
(^|§|[^a-z0-9])vol[^a-z0-9]*([a-z]?[0-9]+[a-z]?)
据我所知,有两种方法可以将 Regex 功能引入 SQL 服务器。
- 通过 CLR:https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/。然而,这个例子(从 2009 年开始)不支持组。有没有常用的解决方案?
- 通过安装主数据服务
由于安装和设置整个 Master Data Services 包感觉获得一些 Regex 功能有点矫枉过正,我希望有一个简单、通用的出路...
我找到了一个超级容易安装的 CLR 实现,并且包含 Regex 捕获组函数。
我已经将它安装在一个名为 'SQL#' 的单独数据库中(只需使用提供的安装 .sql 脚本),这些函数位于同名的模式中。结果我可以使用如下函数:
select SQL#.SQL#.RegEx_CaptureGroup( 'test (2005) test', '\((20[012][0-9]|19[5-9][0-9])\)', 1, NULL, 1, -1, '');
如果默认包含在 SQL 服务器中就好了...
我在 SQL Server 2014 table 中有一些文本数据,我想在其中检测复杂的模式并在文本与模式匹配时提取文本的某些部分。因此,我需要捕获组。
例如
来自正文
"Some title, Some Journal name, vol. 5, p. 20-22"
我要抢卷号
, vol\. ([0-9]+), p\. [0-9]+
请注意,我已经简化了这个用例以提高可读性。上述用例 可以 在不捕获组的情况下解决。实际用例处理更多异常,例如:
- journal/title包含"vol."。
- 包含字母 的卷numbers/pages
- "vol" 后跟“:”或“;”而不是“.”
- ...
我实际使用的正则表达式如下(然而,这不是关于正则表达式结构的问题,只是详细说明为什么我需要捕获组)。
(^|§|[^a-z0-9])vol[^a-z0-9]*([a-z]?[0-9]+[a-z]?)
据我所知,有两种方法可以将 Regex 功能引入 SQL 服务器。
- 通过 CLR:https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/。然而,这个例子(从 2009 年开始)不支持组。有没有常用的解决方案?
- 通过安装主数据服务
由于安装和设置整个 Master Data Services 包感觉获得一些 Regex 功能有点矫枉过正,我希望有一个简单、通用的出路...
我找到了一个超级容易安装的 CLR 实现,并且包含 Regex 捕获组函数。
我已经将它安装在一个名为 'SQL#' 的单独数据库中(只需使用提供的安装 .sql 脚本),这些函数位于同名的模式中。结果我可以使用如下函数:
select SQL#.SQL#.RegEx_CaptureGroup( 'test (2005) test', '\((20[012][0-9]|19[5-9][0-9])\)', 1, NULL, 1, -1, '');
如果默认包含在 SQL 服务器中就好了...