我正在准备数据提取任务。我需要删除一组术语;每个源记录字符串中可以没有、部分或全部出现。有超过 100,000 条目标记录。我想避免执行单个术语匹配/替换操作,因为(a)要删除的术语列表可能会增长,并且(b)一次执行一个术语的当前匹配/替换操作的时间是不可接受的。
我的问题:如何修改正则表达式以包含 OR 分隔列表中的每个术语?
正则表达式
' and | and or | a o | company | co | c o | dba | d b a '
期望的行为
将每个找到的术语(包括前缀和后缀空格)替换为单个空格。
实际行为
找到的每个“偶数”(与“奇数”相反)术语都被替换为单个空格(包括前缀和后缀空格)。
EXAMPLE
源字符串
' MASHABLE LTD DBA THE INFORMATION EXPERTS and and or a o company co c o dba d b a COPYRIGHT '
结果字符串(所需行为)
' MASHABLE LTD THE INFORMATION EXPERTS COPYRIGHT '
结果字符串(实际行为)
' MASHABLE LTD THE INFORMATION EXPERTS and or company c o d b a COPYRIGHT '
环境
SQL Server 2005
用户定义函数 regexReplace 依赖于 VBScript.RegExp (代码在帖子末尾提供)
CODE
set nocount on
declare @source [varchar](800)
declare @regexp [varchar](400)
declare @replace [char](1)
declare @globalReplace [bit]
declare @ignoreCase [bit]
declare @result [varchar](800)
set @globalReplace = 1
set @ignoreCase = 1
SET @source = ' MASHABLE LTD DBA THE INFORMATION EXPERTS and and or a o company co c o dba d b a COPYRIGHT '
set @regexp = ' and | and or | a o | company | co | c o | dba | d b a '
set @replace = ' '
select @result = master.dbo.regexReplace(@source,@regexp,@replace,@globalReplace,@ignoreCase)
print @result
...产生结果:
MASHABLE LTD THE INFORMATION EXPERTS and or company c o d b a COPYRIGHT
* dbo.regex替换用户定义的函数定义 *
CREATE FUNCTION [dbo].[regexReplace]
(
@source varchar(5000),
@regexp varchar(1000),
@replace varchar(1000),
@globalReplace bit = 0,
@ignoreCase bit = 0
)
RETURNS varchar(1000) AS
BEGIN
DECLARE @hr integer
DECLARE @objRegExp integer
DECLARE @result varchar(5000)
EXECUTE @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN NULL
END
EXECUTE @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN NULL
END
EXECUTE @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN NULL
END
EXECUTE @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN NULL
END
EXECUTE @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN NULL
END
EXECUTE @hr = sp_OADestroy @objRegExp
IF @hr <> 0
BEGIN
RETURN NULL
END
RETURN @result
END