Я готовлюсь к задаче извлечения данных.Мне нужно удалить набор терминов;нет, некоторые или все могут присутствовать в каждой строке исходной записи.Есть более 100 000 целевых записей.Я хочу избегать выполнения действий, связанных с заменой или заменой одного термина, поскольку (а) список подлежащих удалению терминов, вероятно, будет расти, и (b) время выполнения текущего действия сопоставления / замены по одному термину за разнеприемлемо.
Мой вопрос: как изменить регулярное выражение, чтобы включить каждый термин в разделенный ИЛИ список?
РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ
' and | and or | a o | company | co | c o | dba | d b a '
Желаемое поведение
Заменить каждый найденный термин (включая пробел и префикс) на один пробел.
Фактическое поведение
Каждый найденный термин "четный" (в отличие от "нечетного") заменяется (включая пробел и префикс) на один пробел.
ПРИМЕР
Строка источника
' 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