ruby on rails正则表达式

时间:2012-06-29 17:13:20

标签: ruby-on-rails ruby regex ruby-on-rails-3 ruby-on-rails-3.1

我是正则表达式的新手,我觉得这很难解决:

我有以下字符串:

"inforun 7970 12423 99 10:03 ? 00:09:03 abcd -PR -gmh domain.den.abc.com -gmp 6020 -guid 9c06cc02-b1c8-41cf-93e6-1d795e9fff62 -rst 180 -s FOLDER_NAME:wkf_workflow.s_session -something Session task instance [session]"

我必须提取time 10:03'domain' domain.den.abc.com以及FOLDER_NAME'workflow' 'wkf_worklfow' 'session' 1}}和's_session'中的time domainfoldernameworkflowsession'abcd -PR -gmh'一直在变化每个字符串都有一堆像这样的字符串作为单个字符串附加。 以下是每个字符串常见的模式。 '?'很常见,有助于找到'-s', ':wkf'之前的时间 folder_name对于所有字符串都是通用的,而'workflow'恰好位于这两个字符串之间。 'wkf_'介于'.s_''s_'之间 会话介于'-'和紧接着的"\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z"之间 我需要时间,域名,文件夹名称,工作流程和会话都在单独的字符串中。 我试着在几天之前练习正则表达式,即使理解{{1}}给出here这样的内容,也花费了很多时间。 谢谢你的帮助

3 个答案:

答案 0 :(得分:0)

正则表达式(时间$1,域名$2,文件夹名称$3,工作流程$4,会话$5):

(?<=\s)(\d{2}:\d{2})(?=\s).*?(?<=\s)((?:[a-zA-Z\d]+(?:\-[a-zA-Z\d]+)*\.)+[a-zA-Z]{2,4})(?=\s).*?(?<=\s)([a-zA-Z\d_]+):wkf_([a-zA-Z\d]+)\.s_([a-zA-Z\d]+)(?=\s)

红宝石:

text = "inforun 7970 12423 99 10:03 ? 00:09:03 abcd -PR -gmh domain.den.abc.com -gmp 6020 -guid 9c06cc02-b1c8-41cf-93e6-1d795e9fff62 -rst 180 -s FOLDER_NAME:wkf_workflow.s_session -something Session task instance [session]"
text =~ /(?<=\s)(\d{2}:\d{2})(?=\s).*?(?<=\s)((?:[a-zA-Z\d]+(?:\-[a-zA-Z\d]+)*\.)+[a-zA-Z]{2,4})(?=\s).*?(?<=\s)([a-zA-Z\d_]+):wkf_([a-zA-Z\d]+)\.s_([a-zA-Z\d]+)(?=\s)/
puts $~.captures

输出:

10:03
domain.den.abc.com
FOLDER_NAME
workflow
session

查看并测试代码here

答案 1 :(得分:0)

这是你可以使用的正则表达式。我不熟悉Ruby / RoR来帮助那里,但假设你真的想要使用正则表达式,这个正则表达式应该一次性为你提供所有东西

^.* (\d\d?:\d\d) \? .*? -gmh (.*?)\..*? -s (.*?):wkf_(.*?)\.s_(.*?) .*$

http://regexr.com?31da7应该显示捕获组及其内容

$1    $2     $3          $4       $5
10:03 domain FOLDER_NAME workflow session

它假设时间紧接在问号之前,并且格式化为数字(可选数字)冒号数字,该域紧跟在'-gmh'之后,文件夹名称跟在-s之后并且在:wkf_之前,工作流程遵循:wkf_,会话在.s _

之后

答案 2 :(得分:0)

假设你正在使用ruby 1.9,这是一个起点:

/(?<time>\d{2}:\d{2}:\d{2}) abcd -PR -gmh (?<domain>[a-zA-Z]*)/i =~ s
/-s (?<folder_name>\w*):wkf_(?<workflow>\w*)\.s_(?<session>\w*)/i =~ s

运行这两行后,您应该:

1.9.3p125 :023 > time
=> "00:09:03" 
1.9.3p125 :024 > domain
 => "domain" 
1.9.3p125 :025 > folder_name
 => "FOLDER_NAME" 
1.9.3p125 :026 > workflow
 => "workflow" 
1.9.3p125 :027 > session
 => "session" 

您仍然需要为每种情况定义允许的字符,并添加错误处理。