2012-01-29 41 views
2

我想從notes刪除從example_header開始的一切。我試圖做的:爲什麼在Ruby中不使用「gsub」刪除管道?

example_header = <<-EXAMPLE 
    ----------------- 
    ---| Example |--- 
    ----------------- 
EXAMPLE 

notes = <<-HTML 
    Hello World 
    #{example_header} 
    Example Here 
HTML 

puts notes.gsub(Regexp.new(example_header + ".*", Regexp::MULTILINE), "") 

但輸出是:

Hello World 
    || 

爲什麼||不會被刪除?

回答

7

正則表達式中的管道被解釋爲alternation operator。正則表達式將取代以下三個字符串:

"-----------------\n---" 
" Example " 
"---\n-----------------" 

當你在一個正則表達式(ideone)使用它您可以通過使用Regexp.escape逃避串解決您的問題:

puts notes.gsub(Regexp.new(Regexp.escape(example_header) + ".*", 
          Regexp::MULTILINE), 
       "") 

你可以還考慮避免使用正則表達式,而只是使用普通字符串方法(ideone):

puts notes[0, notes.index(example_header)] 
+0

謝謝!你能不能建議一種無正則表達式的方法? – 2012-01-29 22:05:23

+1

@Progrog:這不起作用,因爲Misha想要刪除標題*以及其後的所有內容*。 – 2012-01-29 22:15:21

3

管道是regexp語法的一部分(它們表示「或」)。您需要使用反斜槓將它們轉義,以便讓它們作爲實際字符進行匹配。

相關問題