用正则表达式替换重复字符

时间:2011-08-24 08:12:14

标签: regex

我需要一个正则表达式脚本来删除这些特定单词的重复次数。如果出现这些字符,请将其替换为单个。

/[\s.'-,{2,0}]

如果它们出现,我需要用同一个字符替换它。

4 个答案:

答案 0 :(得分:14)

这是你正在寻找的正则表达式吗?

/([\s.'-,])\1+/

好的,现在匹配了。如果您使用的是Perl,则可以使用以下表达式替换

s/([\s.'-,])\1+/$1/g

编辑:如果您正在使用:ahem:PHP,那么您将使用以下语法:

$out = preg_replace('/([\s.\'-,])\1+/', '$1', $in);

()组匹配字符,\1表示它在括号中匹配的相同内容至少再次出现。在替换中,$1指的是第一组括号中的匹配。

注意:这是Perl兼容的正则表达式(PCRE)语法。

来自perlretut手册页:

匹配重复

上一节中的示例显示了令人讨厌的弱点。我们只匹配3个字母的单词,或4个字母或更少的单词。我们希望能够匹配单词或更常见的任意长度的字符串,而无需写出\w\w\w\w|\w\w\w|\w\w|\w等繁琐的替代方法。

这正是量词元字符?*+{}的创建问题。它们允许我们划分我们认为匹配的正则表达式的一部分的重复次数。量词放在我们想要指定的字符,字符类或分组之后。它们具有以下含义:

  • a?表示:匹配'a'1或0次

  • a*表示:匹配'a'0次或更多次,即任意次数

  • a+表示:匹配'a'一次或多次,即至少一次

  • a{n,m}表示:匹配至少“n”次,但不超过“m”次。

  • a{n,}表示:匹配至少“n”次或更多次

  • a{n}表示:完全匹配“n”次

答案 1 :(得分:1)

正如其他人所说,它取决于你的正则表达式引擎,但一个小例子你怎么能这样做: /([ _-,.])\1*/\1/g

使用sed:

$ echo "foo    , bar" | sed 's/\([ _-,.]\)\1*/\1/g'
foo , bar
$ echo "foo,. bar" | sed 's/\([ _-,.]\)\1*/\1/g'
foo,. bar

答案 2 :(得分:0)

使用commennt中提到的Javascript,并假设(您的问题不太清楚)要替换的字符是空格字符,.'-,和,

var str = 'a  b....,,';
str = str.replace(/(\s){2}|(\.){2}|('){2}|(-){2}|(,){2}/g, '$1$2$3$4$5');
// Now str === 'a b..,'

答案 3 :(得分:0)

如果我理解正确,您需要执行以下操作:给定一组字符,用一个字符替换每个字符的多次出现。以下是我在perl中的表现:

perl -pi.bak -e "s/\.{2,}/\./g; s/\-{2,}/\-/g; s/'{2,}/'/g" text.txt

例如,如果text.txt最初包含:

  

这是。这里有两个......应该成为一个单一的。这里的   也是一个双重 - 应该成为一个单一的。终于来了,我们有了   三个'''应该替换为'。

修改如下:

  

这是。这是2。应该成为一个单一的。这里的   也是一个双重 - 应该成为一个单一的。终于来了,我们有了   三个'应该用一个'代替'。

我只是为集合中的每个字符使用相同的替换正则表达式:例如

s/\.{2,}/\./g;

用一个点替换2个或更多个点字符。我连接了几个这样的表达式,一个用于原始集合的每个字符。

可能有更简洁的方法可以做到这一点,但是,我认为这很简单并且有效:)

我希望它有所帮助。