Ruby RegEx /模式匹配用于精确的单词/字符串匹配

时间:2013-11-04 10:43:19

标签: ruby regex erb

快速提问:我有一个这样的文件:

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_rabbitsql_master中的行。我怎样才能选择master而不是其他任何组合?可以在同一行完成吗?干杯!!

3 个答案:

答案 0 :(得分:5)

Word boundary anchors可以在这里提供帮助:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我觉得这不是一个用regexp解决问题的地方。当然,你现在可以让一个工作,但如果你想要排除新的关键词,以后就很难理解并且难以编辑。

我喜欢这种解决问题的方法:

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)