我目前有一个字符串,比如 $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/