繁体   English   中英

从字符串中删除特定单词

[英]remove specific word from string

我正在使用oracle10g

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

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

some text, 123 someone, another text some1

预期产量

 text, 123 someone, another text

请注意,我也想删除some ,如果它包含单词some +其他词比AZaz之前或之后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因为它在az之间有字符
some1some. 被删除因为它没有az之间的字符。

EDIT2

如果我使用正则表达式:

select REGEXP_REPLACE('some text, 123 someone, another text some1','[^a-zA-Z]','')
from dual

我得到输出:

sometextsomeoneanothertextsome

预期产量:

sometextsomeoneanothertext

请注意,我希望some1也可以从字符串中删除,因为它包含除AZ之外的其他字符。

使用regex答案也很感激。

由于在正则表达式的Oracle实现中缺乏对lookbehind / lookaheadword boundary( \\b的支持,似乎不可能满足单个REGEXP_REPLACE调用中的所有要求。 特别是对于案例, 由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

由于匹配模式中包含的用于匹配的分隔符(组#1和组#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示例

这是一种不使用正则表达式的方法:

select trim(replace(' '||'some text, 123 someone, another text some1'||' ',
                    ' some ',' '
                   ) 
           )
from dual;

您可以使用REGEXP_REPLACE函数,如下所示

SELECT REGEXP_REPLACE('some text, 123 someone, another text some1', '(^|\s)some(^|\s)', '')
FROM dual;

SQL小提琴演示

使用REGEX_REPLACE()作为此

SELECT REGEXP_REPLACE('some other text someone other text, someB some1 some.', '(some\s|some\d|some[.])','')
FROM dual;

SQL小提琴演示

希望这可以帮助。 如果它有帮助,请将其标记为答案:)

如果你想要除了以外的任何其他角色. 然后只需将它添加到最后一个[] ,如果你还想匹配一些#,那么只需将其添加到. 像这样[.#]

像这样的东西

SELECT REGEXP_REPLACE('some text, 123 someone, another text some1 some@, SOMEone SoME1', 
                      '(some\d|some[^[:alnum:]]|some$)','',1,0,'i')
FROM dual;

输出:

text, 123 someone, another text , SOMEone

这是模式和选项的解释:

  1. some\\d - “some”这个词后跟任何数字。
  2. some[^[:alnum:]] - 单词“some”后跟任何非字母数字字符。 ^代表否定和[:alnum:]代表字母数字。 所以基本上, [^[:alnum:]][[:alnum:]]相反。
  3. 如果字符串以“some”结尾, some$
  4. 1,0,'i' - 从第一次出现1 ,然后是所有出现0和不区分大小写i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM