2014-01-21 25 views
0

我有一長串信息存儲在一個變量中,我需要針對該變量運行一些正則表達式,並從發現的內容中獲取各種信息。獲取匹配正則表達式的行

  1. 如何在變量中存儲與正則表達式匹配的行?
  2. 如何獲得與正則表達式匹配的行的行號?

這是我正在談論的一個例子。

身體=「服務時間戳記錄的日期時間毫秒本地時間顯示,時區 服務密碼的加密 ! 主機名switch01 ! 引導啓動標誌」

如果我搜索包含「主機名」行我需要行號,在這種情況下它將是4.我還需要將行「hostname switch01」存儲爲另一個變量。

任何想法?

謝謝!

+0

在你的例子中是什麼?你怎麼知道在switch01之後停止? – sln

回答

0

首先,您希望將字符串轉換爲行:body.split('\n'),然後您想要將行號添加到行中:.each_with_index。然後,您要選擇行.select {|line, line_nr| line =~ your_regex }。全部放在一起:

body.split('\n').each_with_index 
       .select {|line, line_nr| line =~ your_regex } 
       .map {|line, line_nr| line_nr } 

這將會給你匹配「your_regex」

0

的所有行假設你有一個對象file,提供了一個#lines方法:已經

lines = file.lines.each_with_index.select {|line, i| line =~ /regex/ } 

如果您有一個行列表,你可以忽略呼叫#lines。如果你有一個字符串,你可以使用string.split("\n")
這將導致變量lines包含一個由2行元素組成的數組,其行數與您的RegEx和原始文件中行的索引相匹配。

擊穿

file.lines得到線 - 當然我也提到這裏可能爲你申請的其他方法。然後我們將這個索引加到#each_with_index的每個元素上,因爲你也想存儲這些。這具有與#map.with_index {|e, i| [e, i]}相同的效果,即將每個元素映射到[element, index]。然後,我們使用#select方法來獲取所有符合RegEx的行(FYI,=~是Ruby,Perl和其他語言的匹配運算符 - 如果您不知道)。之後我們就完成了,但您可能需要進一步轉換數據,以便您可以對其進行處理。