下面的字符串位于一个文件中。这三个人都在同一个文件里。它可能会上升到头部N。
从下面的字符串中,我想要一个类似于
头-1 4未启动
为头-2开始
对于头-3 1已开始,2未启动
HEAD-1
========
NE Server
ASDF 192.168.1.1 not started
ASDF1 192.168.1.1 not started
ASDF2 192.168.1.1 not started
ASDF3 192.168.1.1 not started
HEAD-2
========
NE Server
ASDF 192.168.1.1 started
ASDF1 192.168.1.1 started
HEAD-3
========
NE Server
ASDF 192.168.1.1 not started
ASDF1 192.168.1.1 started
ASDF3 192.168.1.1 not started我只是在Ruby中尝试使用RegExp,通过将所有的头都放到一个数组中,然后将所有的NE项放到另一个2D数组中。
(.*\n{1})(==*\s+)(.\s+)这是只匹配到NE服务器,我希望regex匹配多行。
我可能在regex方法上错了,然后我必须尝试用不同的方法。
提前谢谢。
发布于 2014-02-25 20:23:09
使用正则表达式,string保存整个字符串。应该对正则表达式进行改进以用于生产,例如,只在正确的位置搜索已启动/未开始,而不是在整个字符串(包括服务器名称等)中进行搜索。
status = {}
string.scan(/^(HEAD-\d+)(.*?)(?:\n\n|\Z)/m).each do |match|
name, text = match
started = text.scan(/(?<!not )started/).size
not_started = text.scan(/not started/).size
status[name] = {
started: started,
not_started: not_started
}
end
status
# => {"HEAD-1"=>{:started=>0, :not_started=>4}, "HEAD-2"=>{:started=>2, :not_started=>0}, "HEAD-3"=>{:started=>1, :not_started=>2}}发布于 2014-02-25 20:23:39
如果您可以假设输入将被格式化为您的示例(即每行有一个服务器,在自己的行上设置"HEAD“标题,等等)。您可以使用gets一次获得一行输入,然后将每一行与正则表达式(如^(\w+) (\d+\.\d+\.\d+\.\d+) (.+) )匹配。在这个正则表达式中,您只需检查最后一个组是否“未启动”。如果是的话,将一个添加到未启动服务器的计数中。如果没有,请在已启动服务器的计数中添加一个。如果regex不匹配,请检查它是否匹配^HEAD-(\d+)或类似的内容。
发布于 2014-02-25 20:28:26
下面是我对CSV的不同尝试:
require 'csv'
csv_string = <<_
HEAD-1
========
NE Server
ASDF 192.168.1.1 not started
ASDF1 192.168.1.1 not started
ASDF2 192.168.1.1 not started
ASDF3 192.168.1.1 not started
HEAD-2
========
NE Server
ASDF 192.168.1.1 started
ASDF1 192.168.1.1 started
HEAD-3
========
NE Server
ASDF 192.168.1.1 not started
ASDF1 192.168.1.1 started
ASDF3 192.168.1.1 not started
_
options = {:col_sep => " " ,:skip_blanks => true ,:skip_lines => /[=]+/ }
csv_array = CSV.parse(csv_string,options)
csv_array.slice_before { |a| a.first[/head-\d+/i] }.to_a
# => [[["HEAD-1"],
# ["NE", "Server"],
# ["ASDF", "192.168.1.1", "not", "started"],
# ["ASDF1", "192.168.1.1", "not", "started"],
# ["ASDF2", "192.168.1.1", "not", "started"],
# ["ASDF3", "192.168.1.1", "not", "started"]],
# [["HEAD-2"],
# ["NE", "Server"],
# ["ASDF", "192.168.1.1", "started"],
# ["ASDF1", "192.168.1.1", "started"]],
# [["HEAD-3"],
# ["NE", "Server"],
# ["ASDF", "192.168.1.1", "not", "started"],
# ["ASDF1", "192.168.1.1", "started"],
# ["ASDF3", "192.168.1.1", "not", "started"]]]
report = csv_array.slice_before { |a| a.first[/head-\d+/i] }.map do|inner_ary|
key,_ = inner_ary.shift(2)
not_started,started = inner_ary.partition { |a| a.join(" ")[/\s+not\s+started$/] }
key.push(["started #{started.size}","not started #{not_started.size}"])
end
Hash[report]
# => {"HEAD-1"=>["started 0", "not started 4"],
# "HEAD-2"=>["started 2", "not started 0"],
# "HEAD-3"=>["started 1", "not started 2"]}https://stackoverflow.com/questions/22024855
复制相似问题