为简单起见,我们假设我们输入了这种格式的字符串:
*text1*|*text2*
所以,我想单独留下 text1 ,并删除 text2 中的所有空格。
如果我们没有 text1 ,这可能很容易,一个简单的搜索和替换就像这样:
%s/\s//g
但在这种情况下,我不知道该怎么做。
我尝试了类似的东西:
%s/\(.*|\S*\).\(.*\)/\1\2/g
可以工作,但是只删除第一个字符,我的意思是,对于每个违规空间,这应该在同一行上运行一次。
因此,首选限制是仅使用一次搜索来解决此问题并替换。而且,虽然我使用了Vim语法,但是使用你最熟悉的正则表达式来回答,我的意思是,你可能只需要Perl提供的一些功能。
修改 我对Vim的解决方案:
%s:\(|.*\)\@<=\s::g
答案 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/