匹配行末空格的正则表达式,但不匹配完全为空格的行(缩进占位符)

7

我一直在尝试构建一个Ruby正则表达式,以匹配尾部空格但不包括缩进占位符,这样我就可以使用gsub将它们替换掉。

我使用了/\b[\t ]+$/正则表达式,它运行良好,直到我意识到它仅适用于行末是[a-zA-Z]的情况。 :-( 所以我将其改进为/(?!^[\t ]+)[\t ]+$/,它似乎越来越好了,但它仍然不能正常工作。我花了几个小时尝试让它工作,但无济于事。请帮帮我。

下面是一些文本测试内容,以便轻松地放入Rubular中,但是缩进行已经被剥离了,所以需要添加一些空格和/或制表符。一旦第3和第4行空格回来了,它就不应该匹配第3-5行、7行和9行。

some test test  
some test test      


  some other test (text)
  some other test (text)  
  likely here{ dfdf }
  likely here{ dfdf }        
  and this ;
  and this ;  

另外,有没有更简单/更优雅的方法来完成这个操作?


感谢 Gumbo 提供的内联代码标记。下次我会使用它们的。 :-) - tjmcewan
5个回答

12
如果您正在使用1.9版本,您可以使用look-behind:
/(?<=\S)[\t ]+$/

然而不幸的是,在旧版本的ruby中不支持此功能,因此您将不得不处理捕获到的字符:

str.gsub(/(\S)[\t ]+$/) { $1 }

是的,大多数项目还没有升级到1.9版本。第二个是关键 - 非常感谢! - tjmcewan
人们正在谈论将[\t]更改为“更通用”的版本[\s],“以防您具有非空格和非制表符的空白”。他们所说的“空格”是什么? - parallelgeek
@parallelgeek \s 匹配 "\n", "\r", 和 "\f" - mckeed

1

你的第一个表达式很接近,你只需要把 \b 改成一个取反的字符类。这样应该会更好地工作:

/([^\t ])[\t ]+$

简单来说,这个匹配模式是用于找到所有在不是制表符或空格的字符后面的行中的制表符和空格。

不幸的是,这似乎与缩进占位符匹配 - 这些行完全由空格组成。 - tjmcewan
对我来说不起作用,所以我不确定为什么它对你起作用。该行必须有一个非空格或制表符的字符才能匹配。稍微通用一点的版本是/([^\s])\s+ $ /,以防您有不是空格或制表符的空格。 - Mike Pelley
从上面看,mckeed的第二个答案与我的非常相似,尽管它更加简洁,并且具有Ruby化的优点,因此我建议您接受他的答案; o) - Mike Pelley

0

这会有帮助吗?

/([^\t ])([\t ]+)$/

你需要对匹配的最后一个非空格字符进行一些操作。


0

编辑:哦,你是指非空白行。那么你需要像 /([^\s])\s+/ 这样的东西,并将它们替换为第一部分。

我不完全确定你在问什么,但如果你只想捕获尾随的空格,那么这样的东西不是可以吗?

([\s]+)$

或者如果你只想捕获制表符

([ \t]+)$

由于正则表达式的贪婪性,它们会尽可能多地捕获内容。如果你知道想要捕获的内容,实际上不需要提前给予它们上下文。

对于 "trailing indentation placeholders",我仍然不太确定你的意思,所以如果有误解的地方请谅解。


抱歉,所谓的“缩进占位符”是指您的代码编辑器自动缩进以保持块对齐的位置。这些行完全由空格组成,因此会被 TextMate 自带的标准剥离正则表达式 [\t ]+$ 剥离。 - tjmcewan

0

也许是这样的...

[\t|\s]+?$

或者 [ ]+$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接