我需要一个正则表达式脚本来删除这些特定单词的重复次数。如果出现这些字符,请将其替换为单个。
/[\s.'-,{2,0}]
如果它们出现,我需要用同一个字符替换它。
答案 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个或更多个点字符。我连接了几个这样的表达式,一个用于原始集合的每个字符。
可能有更简洁的方法可以做到这一点,但是,我认为这很简单并且有效:)
我希望它有所帮助。