正则表达式替换给定字符的所有出现,仅在给定匹配之后

时间:2010-08-11 18:04:45

标签: regex perl replace

为简单起见,我们假设我们输入了这种格式的字符串:

*text1*|*text2*

所以,我想单独留下 text1 ,并删除 text2 中的所有空格。

如果我们没有 text1 ,这可能很容易,一个简单的搜索和替换就像这样:

%s/\s//g

但在这种情况下,我不知道该怎么做。

我尝试了类似的东西:

%s/\(.*|\S*\).\(.*\)/\1\2/g

可以工作,但是只删除第一个字符,我的意思是,对于每个违规空间,这应该在同一行上运行一次。

因此,首选限制是仅使用一次搜索来解决此问题并替换。而且,虽然我使用了Vim语法,但是使用你最熟悉的正则表达式来回答,我的意思是,你可能只需要Perl提供的一些功能。

修改 我对Vim的解决方案:

%s:\(|.*\)\@<=\s::g

3 个答案:

答案 0 :(得分:3)

一种方式,在perl:

s/(^.*\||(?=\s))\s*/$1/g

如果您不仅仅需要一次搜索和替换,那么当然可以提高效率。

答案 1 :(得分:3)

所以你有一个包含一个管道(|)的字符串,你想只替换那些不在管道之前的空格?

s/\s+(?![^|]*\|)//g

答案 2 :(得分:0)

您可以尝试在正则表达式中嵌入Perl代码(使用(?{...})语法),但这是一个实验性功能,可能无法在您的方案中使用甚至可用。

s/(.*?\|)(.*)(?{ $x = $2; $x =~ s:\s::g })/$1$x/

理论上应该有效,但我得到了“内存不足!”失败,可以通过用空格替换'\ s'来解决:

s/(.*?\|)(.*)(?{ $x = $2; $x =~ s: ::g })/$1$x/