[英]Ruby RegEx/pattern-match for exact word/string matching
得到一个简单的问题:我有一个这样的文件:
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
而不是其他任何组合呢? 可以在同一行完成吗? 干杯!!
Word边界锚可以在这里帮助:
/^\s*(#|$)|\b(nat|master)\b/
open("/tmp/runnings.txt").each_line
.grep(/\A(?!\s*#)(?!.*\bnat\b)(?!.*\bmaster\b).*\S/) do |line|
...
end
我觉得这不是一个用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.