【发布时间】:2017-01-17 07:43:36
【问题描述】:
我在 SQL Server 2014 表中有一些文本数据,我想在其中检测复杂模式并在文本与模式匹配时提取文本的某些部分。因此,我需要捕获组。
例如
来自正文
"Some title, Some Journal name, vol. 5, p. 20-22"
我要抢卷号
, vol\. ([0-9]+), p\. [0-9]+
请注意,我已简化此用例以提高可读性。上述用例可以在不捕获组的情况下解决。实际用例处理更多异常,例如:
- 包含“vol.”的期刊/标题。
- 卷号/包含字母的页数
- “vol”后跟“:”或“;”而不是“。”
- ...
我使用的实际正则表达式如下(然而,这不是关于正则表达式结构的问题,只是详细说明我为什么需要捕获组)。
(^|§|[^a-z0-9])vol[^a-z0-9]*([a-z]?[0-9]+[a-z]?)
据我所知,有两种方法可以将 Regex 功能导入 SQL Server。
- 通过 CLR:https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/。然而,这个例子(从 2009 年开始)不支持组。有没有常用的解决方案?
- 通过安装 Master Data Services
由于安装和设置整个 Master Data Services 包对于获得一些正则表达式功能来说有点过头了,我希望有一个简单、通用的出路...
【问题讨论】:
-
“我希望有一个简单、通用的出路”——是的,CLR。 .NET 正则表达式支持捕获组,因此请编写您需要的代码并进行部署。
-
@MartinSmith:很高兴知道这一点。我是 SQL Server 的新手(来自 Oracle)和 .NET 的新手。我什至不知道什么是“CLR”是,除了它可以帮助我使用 .NET 正则表达式功能。因此,我想知道是否有任何可用的解决方案,我不必自己编写代码。就像...即插即用。因为我假设我不是第一个需要此功能的人。
-
@Wouter 要了解有关使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上写的关于此主题的系列文章:Stairway to SQLCLR(仅供参考:需要免费注册才能阅读相关内容网站,但这是值得的 :-)。
标签: sql-server regex sql-server-2014 capturing-group