0

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

我有以下字符串:

"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]"

我必须提取timewhich10:03'domain'indomain.den.abc.com和 the FOLDER_NAME, the 'workflow'in the'wkf_worklfow'和 the 'session'in the 's_session', time, domain,foldernameworkflowsession每个字符串不断变化,并且有一堆像这样的字符串都作为单个字符串连接。以下是每个字符串共有的模式。the'abcd -PR -gmh'是常见的,可以帮助找到在 the 之前的时间'?' 对于'-s', ':wkf'所有字符串都是常见的,而 thefolder_name正好在这两者之间。'workflow'介于两者之间,'wkf_'会话'.s_' 介于两者之间's_',紧接下一个'-' 我需要单独的字符串中的时间、域、文件夹名称、工作流和会话。几天前我才尝试练习正则表达式,我什至要花很多时间才能理解这里"\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z"给出的东西 谢谢你的帮助

4

3 回答 3

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

在此处查看并测试代码。

于 2012-06-29T17:20:56.963 回答
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_ 之后

于 2012-06-29T17:32:04.033 回答
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" 

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

于 2012-06-29T17:32:04.233 回答