加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

regex – 如何使用多个OR运算符定义正则表达式,其中每个术语包含

发布时间:2020-12-14 05:48:29 所属栏目:百科 来源:网络整理
导读:我正在准备数据提取任务.我需要删除一组术语;在每个源记录字符串中可以存在无,部分或全部.有超过100,000个目标记录.我想避免执行单项匹配/替换操作,因为(a)要删除的术语列表可能会增长,以及(b)一次执行一个术语的当前匹配/替换操作的时间是不能接受的. 我的
我正在准备数据提取任务.我需要删除一组术语;在每个源记录字符串中可以存在无,部分或全部.有超过100,000个目标记录.我想避免执行单项匹配/替换操作,因为(a)要删除的术语列表可能会增长,以及(b)一次执行一个术语的当前匹配/替换操作的时间是不能接受的.

我的问题:如何修改正则表达式以包含OR分隔列表中的每个术语?

正则表达式

' 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(代码末尾可用的代码)

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.regexReplace用户定义的函数定义*

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

解决方法

试试这个:

(?: (?:and or|and|a o|company|co|c o|dba|d b a))+(?!S)/i

就像@ mathematical.coffee一样,我开始通过分解前导空格并用前瞻替换尾随空格 – 在这种情况下,对于非空白字符是负前瞻.这样,即使令牌是字符串中的最后一个并且后面没有空格,它也会起作用.但最重要的变化是尽可能一次取代两场或多场比赛.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读