繁体   English   中英

如何替换匹配组中所有出现的目标?

[英]How to replace all occurrences of target in matched group?

我想将毯子中所有带引号的字符串替换为 PostgreSQL 中的双引号字符串。

这是我当前的脚本和样本输入。

select regexp_replace(
    'input string',
    '\[(("([^"]+)"|''([^'''']+)'')(, )?)+]',
    '["\3\4"]',
    'g'
)
["The D'Ascoyne Family: The Duke", 'The Banker', 'The Parson', 'The General', 'The Admiral', 'Young Ascoyne', 'Young Henry', 'Lady Agatha']
['Fabian', '...']
['Peter Griffin', 'Stewie Griffin', 'Brian Griffin', 'Carter Pewterschmidt']

但是,它仅替换最后引用的字符串并删除其他所有内容。

["Lady Agatha"]
["..."]
["Carter Pewterschmidt"]

所需的输出如下所示

["The D'Ascoyne Family: The Duke", "The Banker", "The Parson", "The General", "The Admiral", "Young Ascoyne", "Young Henry", "Lady Agatha"]
["Fabian", "..."]
["Peter Griffin", "Stewie Griffin", "Brian Griffin", "Carter Pewterschmidt"]

https://regex101.com/r/dvAIBt/1

我怎样才能克服这个问题?

如果您的字符串不包含"""子字符串,您可以使用

REPLACE(REGEXP_REPLACE(col, '("[^"\\]*(?:\\.[^"\\]*)*")|''([^''\\]*(?:\\.[^''\\]*)*)''', '\1"\2"'), '"""', '"')

("[^"\\]*(?:\\.[^"\\]*)*")|'([^'\\]*(?:\\.[^'\\]*)*)'正则表达式匹配

  • ( - 第 1 组开始:
  • " - 一个"字符
  • [^"\\]* - 除"\之外的零个或多个字符
  • (?:\\.[^"\\]*)* - 零个或多个\序列,后跟任何单个字符,然后是"\以外的零个或多个字符
  • " - 一个"字符
  • ) - 第 1 组结束
  • | - 或者
  • ' - 一个'字符
  • ([^'\\]*(?:\\.[^'\\]*)*) - 第 2 组:除'\之外的零个或多个字符,然后是零个或多个\序列,后跟任何单个字符char 然后除'\之外的零个或多个字符
  • ' - 一个'字符。

由于"..."字符串文字不需要更改,它们将被替换为自己 + "" ,因此它们的右侧将有""" ,因此,您只需要添加一个REPLACE即可替换所有"""" s。

暂无
暂无

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

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