gpt4 book ai didi

sql - REGEXP_REPLACE 不会发生连续模式替换

转载 作者:行者123 更新时间:2023-12-04 23:45:36 25 4
gpt4 key购买 nike

我有一个字符串如下
Welcome to the world of the Hackers
我正在尝试替换列出的字符串的出现,即 of,to,the在使用以下查询的整个字符串之间,但如果模式是连续的,它就不能正常工作,它会失败。

SELECT regexp_replace( 'Welcome to the world of the Hackers', '( to )|( the )|( of )', ' ' ) 
FROM dual;

输出: Welcome the world the Hackers
即使模式连续重复,它也不起作用,即
SELECT regexp_replace( 'Welcome to to the world of the Hackers', '( to )|( the )|( of )', ' ' ) 
FROM dual;

输出: Welcome to world the Hackers
而我的预期输出是: Welcome world Hackers
使用 REGEXP_REPLACE 是否有任何替代方案/解决方案? ?

最佳答案

您可以使用正则表达式 (^|\s+)((to|the|of)(\s+|$))+ :

SQL Fiddle

查询 1 :

WITH test_data ( sentence ) AS (
SELECT 'to the of' FROM DUAL UNION ALL
SELECT 'woof breathe toto' FROM DUAL UNION ALL -- has all the words as sub-strings of words
SELECT 'theory of the offer to total' FROM DUAL -- mix of words to replace and words starting with those words
)
SELECT sentence,
regexp_replace(
sentence,
'(^|\s+)((to|the|of)(\s+|$))+',
'\1'
) AS replaced
FROM test_data

Results :
|                     SENTENCE |           REPLACED |
|------------------------------|--------------------|
| to the of | (null) | -- All words replaced
| woof breathe toto | woof breathe toto |
| theory of the offer to total | theory offer total |

Why doesn't regexp_replace( 'Welcome to the world of the Hackers', '( to )|( the )|( of )', ' ' ) work with successive matches?



因为正则表达式解析器会寻找第二个匹配项 第一个匹配项的结尾,并且在查找后续匹配项时将不包括字符串的已解析部分或替换文本。

所以第一场比赛将是:
 'Welcome to the world of the Hackers'
^^^^

第二个匹配项将在该匹配项之后的子字符串中查找
 'the world of the Hackers'
^^^^
'the '在子字符串的开头将不会被匹配,因为它没有前导空格字符(是的,它之前有一个空格,但在前一个匹配中匹配,是的,该匹配被替换为空格但重叠匹配和先前替换的匹配不是正则表达式的工作方式)。

所以第二场比赛是 ' of '在剩余子串的中间。

不会有第三个匹配项,因为剩余的未解析子字符串是:
'the Hackers'

再次, 'the '不匹配,因为没有要匹配的前导空格字符。

关于sql - REGEXP_REPLACE 不会发生连续模式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50701025/

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