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

nbysray5  于 2023-06-25  发布在  其他
关注(0)|答案(4)|浏览(123)

我需要一个正则表达式脚本来删除这些特定的话双重复。。如果这些字符发生替换为单。

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

这些是字符,如果他们来了,我需要取代它与单一相同的字符。

fhg3lkii

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的一部分划分重复的数量。量词被直接放在我们想要指定的字符、字符类或分组之后。它们具有以下含义:

  • a?表示:匹配'a' 1或0次
  • a*表示:匹配‘a’0次或更多次,即,任何次数
  • a+表示:匹配“a”1次或更多次,即,至少一次
  • a{n,m}表示:匹配至少“n”次,但不超过“m”次。
  • a{n,}表示:匹配至少“n”次或更多次
  • a{n}表示:完全匹配“n”次
tpgth1q7

tpgth1q72#

正如其他人所说,这取决于你的regex引擎,但一个小例子,你可以这样做:/([ _-,.])\1*/\1/g
使用sed:

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

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..,'
carvr3hs

carvr3hs4#

如果我理解正确的话,你想做以下事情:给定一组字符,用单个字符替换每个字符的任何多次出现。下面是我在perl中的做法:

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

例如,如果text.txt最初包含:
这里是。这里是2。这应该成为一个单一的。这里还有一个双胞胎--应该变成一个单胞胎。最后,我们这里有三个“”,应该用一个“”代替。
修改如下:
这里是,这里是2。应该成为一个单一的。这里也有一个双重的-应该变成一个单一的。最后我们有三个“应该用一个来代替”。
我只是对集合中的每个字符使用相同的替换正则表达式:例如

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

用一个点替换出现两次或多次的点字符。我连接了几个这样的表达式,每个表达式对应原始集合中的每个字符。
可能有更紧凑的方法来做到这一点,但是,我认为这很简单,而且很有效:)
希望能帮上忙。

相关问题