我需要一个正则表达式脚本来删除这些特定的话双重复。。如果这些字符发生替换为单。
/[\s.'-,{2,0}]
这些是字符,如果他们来了,我需要取代它与单一相同的字符。
fhg3lkii1#
与之匹配的PCRE-compatible regex为:
/([\s.',-])\1+/
如果你使用的是Perl,你可以用下面的表达式 * 替换 * 它:
s/([\s.',-])\1+/$1/g
如果你使用的是PHP,那么你可以使用以下语法:
$out = preg_replace('/([\s.\',-])\1+/', '$1', $in);
()
\s
. ' - ,
-
[]
\1
$1
注意:这是Perl兼容的正则表达式(PCRE)语法。来自perlretut手册页:匹配重复上一节中的示例显示了一个令人讨厌的弱点。我们只匹配3个字母的单词,或者4个字母或更少的单词块。我们希望能够匹配单词,或者更一般地,匹配任何长度的字符串,而不需要写出像\w\w\w\w|\w\w\w|\w\w|\w这样乏味的替代方案。这正是创建量词元字符?、*、+和{}所要解决的问题。它们允许我们为我们认为匹配的regexp的一部分划分重复的数量。量词被直接放在我们想要指定的字符、字符类或分组之后。它们具有以下含义:
\w\w\w\w|\w\w\w|\w\w|\w
?
*
+
{}
a?
a*
a+
a{n,m}
a{n,}
a{n}
tpgth1q72#
正如其他人所说,这取决于你的regex引擎,但一个小例子,你可以这样做:/([ _-,.])\1*/\1/g使用sed:
/([ _-,.])\1*/\1/g
$ echo "foo , bar" | sed 's/\([ _-,.]\)\1*/\1/g' foo , bar $ echo "foo,. bar" | sed 's/\([ _-,.]\)\1*/\1/g' foo,. bar
n6lpvg4x3#
使用注解中提到的JavaScript,并假设(从你的问题中看不太清楚)你想要替换的字符是空格字符,.,',-和,:
.
'
,
var str = 'a b....,,'; str = str.replace(/(\s){2}|(\.){2}|('){2}|(-){2}|(,){2}/g, '$1$2$3$4$5'); // Now str === 'a b..,'
carvr3hs4#
如果我理解正确的话,你想做以下事情:给定一组字符,用单个字符替换每个字符的任何多次出现。下面是我在perl中的做法:
perl -pi.bak -e "s/\.{2,}/\./g; s/\-{2,}/\-/g; s/'{2,}/'/g" text.txt
例如,如果text.txt最初包含:这里是。这里是2。这应该成为一个单一的。这里还有一个双胞胎--应该变成一个单胞胎。最后,我们这里有三个“”,应该用一个“”代替。修改如下:这里是,这里是2。应该成为一个单一的。这里也有一个双重的-应该变成一个单一的。最后我们有三个“应该用一个来代替”。我只是对集合中的每个字符使用相同的替换正则表达式:例如
s/\.{2,}/\./g;
用一个点替换出现两次或多次的点字符。我连接了几个这样的表达式,每个表达式对应原始集合中的每个字符。可能有更紧凑的方法来做到这一点,但是,我认为这很简单,而且很有效:)希望能帮上忙。
4条答案
按热度按时间fhg3lkii1#
与之匹配的PCRE-compatible regex为:
如果你使用的是Perl,你可以用下面的表达式 * 替换 * 它:
如果你使用的是PHP,那么你可以使用以下语法:
说明
()
组匹配单个字符,在本例中是空白字符(\s
)或标点字符(. ' - ,
)。最好将-
放在[]
中的列表末尾。\1
意味着它在括号中匹配的相同内容至少会再次出现。$1
引用第一组括号中的匹配项。注意:这是Perl兼容的正则表达式(PCRE)语法。
来自perlretut手册页:
匹配重复
上一节中的示例显示了一个令人讨厌的弱点。我们只匹配3个字母的单词,或者4个字母或更少的单词块。我们希望能够匹配单词,或者更一般地,匹配任何长度的字符串,而不需要写出像
\w\w\w\w|\w\w\w|\w\w|\w
这样乏味的替代方案。这正是创建量词元字符
?
、*
、+
和{}
所要解决的问题。它们允许我们为我们认为匹配的regexp的一部分划分重复的数量。量词被直接放在我们想要指定的字符、字符类或分组之后。它们具有以下含义:a?
表示:匹配'a' 1或0次a*
表示:匹配‘a’0次或更多次,即,任何次数a+
表示:匹配“a”1次或更多次,即,至少一次a{n,m}
表示:匹配至少“n”次,但不超过“m”次。a{n,}
表示:匹配至少“n”次或更多次a{n}
表示:完全匹配“n”次tpgth1q72#
正如其他人所说,这取决于你的regex引擎,但一个小例子,你可以这样做:
/([ _-,.])\1*/\1/g
使用sed:
n6lpvg4x3#
使用注解中提到的JavaScript,并假设(从你的问题中看不太清楚)你想要替换的字符是空格字符,
.
,'
,-
和,
:carvr3hs4#
如果我理解正确的话,你想做以下事情:给定一组字符,用单个字符替换每个字符的任何多次出现。下面是我在perl中的做法:
例如,如果text.txt最初包含:
这里是。这里是2。这应该成为一个单一的。这里还有一个双胞胎--应该变成一个单胞胎。最后,我们这里有三个“”,应该用一个“”代替。
修改如下:
这里是,这里是2。应该成为一个单一的。这里也有一个双重的-应该变成一个单一的。最后我们有三个“应该用一个来代替”。
我只是对集合中的每个字符使用相同的替换正则表达式:例如
用一个点替换出现两次或多次的点字符。我连接了几个这样的表达式,每个表达式对应原始集合中的每个字符。
可能有更紧凑的方法来做到这一点,但是,我认为这很简单,而且很有效:)
希望能帮上忙。