如何替换第二次出现的点

Posted

技术标签:

【中文标题】如何替换第二次出现的点【英文标题】:how to replace dots from 2nd occurrence 【发布时间】:2021-09-24 08:01:28 【问题描述】:

我有软件版本的专栏。我试图从列中的第二次出现中删除点,例如

select REGEXP_REPLACE('12.5.7.8', '.','');

预计为 12.578

样本数据为here

是否可以从第二次出现中删除点

【问题讨论】:

“第二次出现后删除点”对我来说意味着结果应该有 2 个点。您想要的结果是 1。哪个是正确的? 如果您的目标是创建“可排序”的东西,那么您也可以通过将其转换为数组string_to_array('12.5.7.8', '.')::int[] 来实现 【参考方案1】:

一种选择是将其分成两部分:

获取第一个数字。 以数组形式获取其余数字。

然后将数组转换为不带分隔符的字符串,并与第一个合并:

select (split_part('12.5.7.8', '.', 1) || '.' || 
        array_to_string((REGEXP_SPLIT_TO_ARRAY('12.5.7.8', '[.]'))[2:], '')
       )

另一种选择是将第一个 '.' 替换为其他内容,然后删除 '.'s 并将其他内容替换为 '|'

select translate(regexp_replace(version, '^([^.]+)[.](.*)$', '\1|\2'), '|.', '.')
from software_version;

Here 是三个版本的数据库fiddle,包括评论中提到的 a_horse_with_no_name 版本。

【讨论】:

不需要regexp_split_to_array() (string_to_array('12.5.7.8', '.'))[2:] 也可以工作,并且可能更快,因为不涉及正则表达式 @GordonLinoff 我看到第二版和第三版查询比Here中的第一版查询快【参考方案2】:

我只取左右:

concat(
  left(str, position('.' in str)), 
  replace(right(str, -position('.' in str)), '.', '')
)

对于12.34.56.78 中的strleft 给出12.,而使用负数位置的右侧给出34.56.78,替换然后删除点

【讨论】:

以上是关于如何替换第二次出现的点的主要内容,如果未能解决你的问题,请参考以下文章

替换 R 中第一次出现的“:”但不是第二次

一点二次插值二点二次插值 ,matlab

使用 Powershell 将第二次出现的“-”替换为“_”

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

最优化——三点二次插值法(MATLAB实现)

最优化——三点二次插值法(MATLAB实现)