Рубин регулярное выражение шаблон-матч за точное слово/строку, соответствующую


Есть быстрый вопрос: у меня есть такой файл:

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

Моя цель-прочитать файл, пропуская комментарии (начинается с #), пустые/пустые строки и строки с nat или master в нем. Я попробовал это:

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

, который почти работает, но он также устраняет строки с master_rabbit и sql_master в нем. Как я могу выбрать только master, а не любую другую комбинацию этого? Можно ли это сделать в той же линии? Ура!!

3 3

3 ответа:

Якоря границы слова могут помочь здесь:

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

Я чувствую, что это не то место, где проблема должна быть решена с помощью регулярного выражения. Конечно, вы можете заставить его работать сейчас, но позже будет трудно понять и труднее отредактировать, если вы получите новые ключевые слова для исключения.

Мне нравится такой способ решения задачи:

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)