gpt4 book ai didi

sql - 从字符串中删除特定单词

转载 作者:行者123 更新时间:2023-12-04 18:27:50 25 4
gpt4 key购买 nike

我正在使用 oracle10g .

我想从句子中删除所有出现的特定单词,但我不想删除包含 a-z 或 A-Z 之间其他字符的任何其他单词。

例如 , 以下是我想删除的句子some :

some text, 123 someone, another text some1

预期输出 :
 text, 123 someone, another text

请注意,我还想删除 some如果它包含 some 的话+ 除 A-Z 之外的任何其他词和 a-z之前或之后 some .

这是我迄今为止尝试过的:
select replace('some text, 123 someone, another text some1','some','') 
from dual;

我得到输出:
 text, 123 one, another text 1

在上面的输出中,我期待 someone不可更换和 some1应该完全更换。

我应该如何实现这一目标?任何建议将不胜感激。

编辑:为清楚起见,这是我正在寻找的另一个例子:
some other text someone other text, someB some1 some.

输出应该是:
 other text someone other text, someB 

从上面的句子 someB未被删除,因为它在 a-z 之间有字符
some1some.被删除,因为它在 a-z 之间没有字符.

编辑 2

如果我使用正则表达式:
select REGEXP_REPLACE('some text, 123 someone, another text some1','[^a-zA-Z]','')
from dual

我得到输出:
sometextsomeoneanothertextsome

预期输出:
sometextsomeoneanothertext

请注意,我想要 some1也可以从字符串中删除,因为它包含除 A-Z 之外的其他字符.

使用 regex 的答案也受到赞赏。

最佳答案

由于缺乏对 lookbehind/lookahead 的支持和 word boundary( \b )在Oracle实现正则表达式中,似乎不可能在单个 REGEXP_REPLACE 中满足所有要求。称呼。特别是案例,pointed out by Egor Skriptunoff : 模式匹配,然后一一匹配,它们之间只有一个分隔符,如 some some some some ... .

如果没有这种情况,则可以通过此调用匹配所有此类字符串:

regexp_replace(
source_string, -- source string
'([^[:alnum:]]|^)((\d)*some(\d)*)([^[:alnum:]]|$)', -- pattern
'\1\5', -- leave separators in place
1, -- start from beginning
0, -- replace all occurences
'im' -- case-insensitive and multiline
);

图案部分:
(                -- start of Group #1
[^[:alnum:]] -- any non-alphanumeric character
| -- or
^ -- start of string or start of line
) -- end of Group #1
( -- start of Group #2
( -- start of Group #3
\d -- any digit
) -- end of Group #3
* -- include in previous group zero or more consecutive digits
some -- core string to match
( -- start of group #4
\d -- any digit
) -- end of group #4
* -- include in previous group zero or more consecutive digits
) -- end of Group #2
( -- start of Group #5
[^[:alnum:]] -- any non-alphanumeric character
| -- or
$ -- end of string or end of line
) -- end of Group #5

因为用于匹配的分隔符(Group #1 和 Group #5)包含在匹配模式中,它会在成功匹配时从源字符串中删除,所以我们需要通过在第三个 regexp_replace 中指定来恢复这部分。范围。

基于此解决方案,可以替换循环中的所有甚至重复出现的事件。

例如,您可以定义这样的函数:
create or replace function delete_str_with_digits(
pSourceString in varchar2,
pReplacePart in varchar2 -- base string (like 'some' in question)
)
return varchar2
is
C_PATTERN_START constant varchar2(100) := '([^[:alnum:]]|^)((\d)*';
C_PATTERN_END constant varchar2(100) := '(\d)*)([^[:alnum:]]|$)';

vPattern varchar2(4000);
vCurValue varchar2(4000);
vPatternPosition binary_integer;
begin

vPattern := C_PATTERN_START || pReplacePart || C_PATTERN_END;
vCurValue := pSourceString;

vPatternPosition := regexp_instr(vCurValue, vPattern);

while(vPatternPosition > 0) loop
vCurValue := regexp_replace(vCurValue, vPattern,'\1\5',1,0,'im');
vPatternPosition := regexp_instr(vCurValue, vPattern);
end loop;

return vCurValue;

end;

并将其与 SQL 或其他 PL/SQL 代码一起使用:
SELECT 
delete_str_with_digits(
'some text, -> awesome <- 123 someone, 3some3
line of 7 :> some some some some some some some <
222some another some1? some22 text 0some000',
'some'
) as result_string
FROM
dual

SQLFiddle example

关于sql - 从字符串中删除特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21527273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com