regex - 删除一行中的重复字符,包括空格

标签 regex perl


我目前有一个字符串,比如 $line='55.25040882, 3,,,,,,',我想从中删除所有空格和重复的逗号和句点。目前,我有:

    $line =~ s/[.,]{2,}//;
    $line =~ s/\s{1,}//;

当我得到 '55.25040882,3' 时,这是有效的,但是当我尝试时

$line =~ s/[.,\s]{2,}//;

它拉出“,”并留下“,,,,,,”。我想保留第一个逗号并去掉空格。
有没有办法用一行正则表达式优雅地做到这一点?如果我需要提供其他信息,请告诉我。

编辑:因为有这么多解决方案,我决定用下面的答案更新我的问题:

$line =~ s/([.,])\1{1,}| |\t//g;

这将删除所有重复的句点和逗号,删除所有空格和制表符,同时保留\r 和\n 字符。有很多方法可以做到这一点,但这是我选择的一种。非常感谢!

最佳答案

这主要是对 Rohit's answer 的批评,其中似乎包含一些关于字符类语法的误解,尤其是否定运算符 (^)。具体来说:

  • [(^\n^\r)\s] 匹配 (^) 或任何空白字符,包括换行符 (\n) 和回车符 (\r)。事实上,它们每个都被指定了两次(因为 \s 也匹配它们),尽管该类仍然一次只使用一个字符。

  • ^[\n\r]|\s 匹配字符串开头的换行符或回车符,或任何地方的任何空白字符(这使得第一部分变得多余,因为任何空白字符包括换行符和回车符,任何地方包括字符串的开头)。

在一个字符类中,插入符 (^) 否定所有跟在 iff 之后的所有内容的含义,它紧跟在开头 [; 之后。在其他任何地方,它只是一个插入符。除了 \ 之外的所有其他元字符完全在字符类中失去了它们的特殊含义。 (但通常非特殊字符 -] 变得特殊。)

在字符类之外,^ 是一个 anchor 。


下面是我将如何编写正则表达式:

$line =~ s/([.,])\1+|\h+//g;

解释:

  • 由于您最终选择了 ([.,])\1{1,},我假设您想要匹配重复句点重复的逗号,而不是像 .,,. 这样的东西。正则表达式的成功意味着学习以正则表达式引擎的方式查看文本,这并不直观。如果您尝试按照正则表达式引擎(如果它会说话)的方式描述每个问题,您将对自己有很大帮助。

  • {1,} 并没有错,但是当 + 做同样的事情时,为什么要在你的正则表达式中添加所有这些困惑呢?

    <
  • \h 匹配水平 空格,其中包括空格和制表符,但不包括换行符或回车符。 (这只适用于 Perl,AFAIK。在 Ruby/Oniguruma 中,\h 匹配一个十六进制数字;在我所知道的所有其他风格中,这是一个语法错误。)

关于regex - 删除一行中的重复字符,包括空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877046/

相关文章:

python - 无效的表达式 sre_constants.error : nothing to repeat

java - 正则表达式 - 禁止某些字符连续出现

c# - 在 C# 中使用 WebClient 有没有办法在重定向后获取站点的 URL?

python - 低效代码 : comparing combining different columns from different files awk or perl?

perl - 键/值的分配顺序是什么?

perl - 如何自动运行大量 perl 脚本?

regex - 相当于 C#\p{_xmlI}[\p{_xmlC}-[ :]]* 的可移植正则表达式

perl - 要散列的分隔行的拆分列表

perl - 如何替换在给定数据子集中仅出现一次的特定词?

regex - 记事本中的正则表达式或