正则表达式命令正在替换两个字符而不是一个字符

时间:2015-03-07 15:23:52

标签: regex perl whitespace substitution

我正在尝试使用under-bar替换字符串中的空格。凭借我有限的编码经验,我想出了这个 -

s/\b[ ]\D/_/g

此命令用于查找我的文件的所有相应选择,但是它会替换空格和前进字符而不是空格。我怎样才能确保它只替换空格而不添加其他字符? 另外,我不希望这会影响数字字符(因此\ D)。

2 个答案:

答案 0 :(得分:1)

正则表达式\b[ ]\D(顺便说一下,也可以写成\b \D)匹配空格和下面的非数字字符,这样就用下划线代替了。

有两个(嗯,还有更多,但这两个是直截了当的)在Perl中解决这个问题的方法:

使用捕获组和后退参考:

s/\b (\D)/_\1/g

此处正则表达式仍将匹配空格和非数字字符,但非数字字符将被记住为\1并用作替换的一部分。

使用先行的零长度断言:

s/\b (?=\D)/_/g

(?=\D)匹配空字符串if(且仅当)后跟匹配\D的字符串,因此非数字字符不再是匹配的一部分,不会被替换。

附录顺便说一下,我怀疑您打算使用\b\D而不仅仅是\D\D匹配空格(因为它们不是数字),因此

$ echo 'foo 123 bar  baz qux' | perl -pe 's/\b (?=\D)/_/g'
foo 123_bar_ baz_qux

而不是

$ echo 'foo 123 bar  baz qux' | perl -pe 's/\b (?=\b\D)/_/g'
foo 123_bar  baz_qux

答案 1 :(得分:-2)

尝试    S / \ S / _ /克

\ s是匹配所有空格的字符。 如果您担心邻接空间,请使用\ s + +表示1个或多个空白字符。