【问题标题】:REGEXP_REPLACE in Postgresql not substringPostgresql 中的 REGEXP_REPLACE 不是子字符串
【发布时间】:2020-03-26 03:20:30
【问题描述】:

在 postgresql 中,我只想替换为完整的单词而不是子字符串。我注意到即使在子字符串中替换和翻译也会替换字符串。然后,我使用 regexp_replace 添加以下内容:

SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-z0-9])' || UPPER('CAT') || '($|[^a-z0-9])', '\1' || UPPER('GATO') || '\2','g')

在前面的示例中,CAT 不应该被替换,因为它不是一个完整的单词,而是一个单词的一部分的子字符串。我怎样才能避免更换?输出应该是 BIG CATDOG,因为不可能进行替换。

谢谢

【问题讨论】:

    标签: regex postgresql replace regexp-replace


    【解决方案1】:

    发生替换是因为您只在搜索词之后检查[^a-z0-9],而D 不在该字符类中。您可以通过将A-Z 添加到您的角色类来解决此问题:

    SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-zA-Z0-9])' || UPPER('CAT') || '($|[^a-zA-Z0-9])', '\1' || UPPER('GATO') || '\2','g')
    

    或者通过在替换调用中添加i 标志:

    SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '(^|[^a-z0-9])' || UPPER('CAT') || '($|[^a-z0-9])', '\1' || UPPER('GATO') || '\2','gi')
    

    无论哪种情况,您都将获得所需的BIG CATDOG 输出。

    但是更好的解决方案是使用单词边界约束\m(单词开头)和\M(单词结尾):

    SELECT REGEXP_REPLACE (UPPER('BIG CATDOG'), '\m' || UPPER('CAT') || '\M', UPPER('GATO'),'g')
    

    Demo on dbfiddle

    【讨论】:

    • @JuanPerez 不用担心。正如您回复的那样,我进行了编辑,使用边界约束这个词可能是一个更好的解决方案。
    猜你喜欢
    • 2018-07-20
    • 2016-06-07
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2017-01-11
    • 2021-12-17
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多