Рубин регулярное выражение шаблон-матч за точное слово/строку, соответствующую
Есть быстрый вопрос: у меня есть такой файл:
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 ответа:
Якоря границы слова могут помочь здесь:
/^\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)