2011-11-21 60 views
0

我试图删除以长字符串(即回复电子邮件)中的字符'>'开始的任何行。删除在rails字符串中以>开头的行

在PHP中,我会用if语句迭代每行,在linux中我会尝试使用sed或awk。

什么是最优雅的钢轨方法?

+1

我认为你应该删除标记sed和awk,除非sed/awk的解决方案也被你接受。 – Kent

回答

0

你的问题暗示输入一个字符串,包含多行。 你是否希望输出只是一个多行的字符串?我假设是的。

或者使用字符串和数组操作:

str.lines.reject{|x| x =~ /^>/}.join # this will return a new string, without those ">" lines 

或使用正则表达式:

str.gsub(/^>.+\n*/. '') 

更好的解决方案:

您将需要使用非贪婪的多线匹配模式为您的正则表达式:?

str.gsub(/^>.*?$\n*/m, '') # by using gsub!() you can modify the string in place 

^>在一行

的开头匹配您的“>”字符* $匹配的起始字符,直到行结束之后的任何字符(非贪婪)

\ n *换行字符本身匹配,如果任何(您想删除以及)

“米”在正则表达式的结束表明多线路匹配,这将适用于RegExp用于字符串中的每一行。

+0

这似乎是失败的最后一行我是否有任何理由,为什么这可能是这种情况?我使用'更好的解决方案' – cjm2671

+0

放置\ n *而不是\ n – Tilo

0

它应该像您期望:

your_string.lines.to_a.reject{|line| line[0] == '>'}.join 
+0

这不是双重否定吗?我认为这将完全相反 - 但我可以修复它!谢谢! – cjm2671

+0

您的解决方案在输出字符串中留下额外的“\ n”字符。 '.to_a'不需要。 'line [0] =='>''不是很优雅。 – 2011-11-21 23:33:32

+0

如果行必须以'>'开头,这是最快的方法。 – Hauleth

2

你可以试试这个:

your_string.gsub(/^\>.+\n/,'') 
相关问题