2013-11-04 196 views
3

有一個快速的問題:我有一個這樣的文件:Ruby的正則表達式/模式匹配的精確字/字符串匹配

ip-10-0-12-84.eu-west-1.compute.internal, master, instnum=1, Running 
..... 
..... 
ip-10-0-26-118.eu-west-1.compute.internal, master_rabbit, instnum=4, Running 
ip-10-0-26-116.eu-west-1.compute.internal, master_rabbit, instnum=5, Running 
..... 
ip-10-0-26-68.eu-west-1.compute.internal, sql_master, instnum=9, Running 
ip-10-0-13-244.eu-west-1.compute.internal, nat, instnum=2, Running 

我的目標是要讀取的文件,跳過註釋(以#開始)空白/空白行以及其中包含natmaster的行。我嘗試這樣做:

open('/tmp/runnings.txt').each do |line| 
    next if line =~ /(^\s*(#|$)|nat|master)/ 

這幾乎是工作,但它也消除了與master_rabbit和它sql_master行。我怎樣才能選擇master而不是其他任何組合?它可以在同一行中完成嗎?乾杯!!

+0

搜索「主人,」而不只是‘主’:) – tessi

+2

做同樣的去'nat',以及?或者你想要匹配'國家'呢? –

+0

@Tim Pietzcker:目前不需要'國家',但這是一個很好的觀點。你的答覆蓋了。 – MacUsers

回答

5

Word boundary anchors可以幫助在這裏:

/^\s*(#|$)|\b(nat|master)\b/ 
+0

謝謝蒂姆,這正是我需要的;很好地完成了這項工作。我知道有一種比我想象的更容易做到的方式。 – MacUsers

1
open("/tmp/runnings.txt").each_line 
.grep(/\A(?!\s*#)(?!.*\bnat\b)(?!.*\bmaster\b).*\S/) do |line| 
    ... 
end 
1

,我覺得這是不是哪裏出了問題應該用正則表達式來解決的地方。當然你可以讓一個人現在工作,但如果你有新的關鍵字排除在後面,那麼很難再理解和難以編輯。

我喜歡解決問題的是這樣的:

FILE_PATH = '/tmp/runnings.txt' 
keywords = ['nat', 'master'] 
empty_lines_and_comments  = ->x{ x.chomp.empty? or x.start_with?('#') } 
lines_containing_bad_keyword = ->x{ keywords.include? x[1] } # Keywords at index 1 

data = File.readlines(FILE_PATH) 
      .reject(&empty_lines_and_comments) 
      .map{|line| line.chomp.split(', ')} 
      .reject(&lines_containing_bad_keyword) 
+0

考慮到文件的非常靜態性質(有問題),我認爲目前沒有任何額外的關鍵字需要,但總是很好地知道做某些事情的正確方法。感謝代碼;我肯定有一些使用FPR它。乾杯!! – MacUsers