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

Я должен извлечь time который 10:03 и 'domain' в domain.den.abc.com и FOLDER_NAME, то 'workflow' в 'wkf_worklfow' и 'session' в 's_session'time, domain, foldername, workflow и session продолжают меняться для каждой строки, и есть целая цепочка таких строк, каждая из которых прикреплена как одна строка. Вот шаблоны, которые являются общими для каждой строки. 'abcd -PR -gmh' является общим и может помочь в поиске времени, которое находится непосредственно перед '?' '-s', ':wkf' является общим для всей строки, и folder_name находится прямо между этими двумя. 'workflow' находится между 'wkf_' и '.s_' сеанса между 's_' и непосредственной следующей '-' мне нужно время, домен, имя папки, рабочий процесс и сеансом все в отдельно строках. я пытался практиковать регулярное выражение только несколько дней назад она занимает так много времени для меня даже постигать что-то вроде "\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z" которое дается here Спасибо за вашу помощь

ответ

0

Regex (время $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) 

Ruby:

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.

+0

Привет, я не знаю, если я делаю правильную вещь, вот мой код: string2, string1 = string.scan (/ (? <= \ S) (\ d {2}: \ d {2}) (? = \ s) /) «string» имеет строку i, помещенную в вопросе, и iam, используя string.split string3, string4 = string.scan (/ (? <= \ s) ((?: [a-zA-Z \ d] + (?: \ - [a-zA-Z \ d] +) * \.) + [a-zA-Z] {2,4}) (? = \ s) /) string5, string6, string7 = string.scan (/ (? <= \ s) ([a-zA-Z \ d_] +): wkf _ ([a-zA-Z \ d] +) \. s _ ([a-zA-Z \ d] +) (? = \ s) /) Очевидно, что я делаю что-то неправильно здесь, пожалуйста, дайте мне знать. Спасибо – user1455116

+0

@opensourceis - см. Обновленный ответ с кодом ruby ​​ –

+0

Спасибо, кажется, что-то работает для меня – user1455116

0

Это регулярное выражение, которое вы можете использовать. Я не достаточно хорошо знаком с Руби/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_

+0

Привет, У меня есть несколько строк, как показано выше, объединенные в одну строку. Ваше выражение работает, но печатает только последний шаблон, с которым он сталкивается. – user1455116

+0

Вам нужно найти способ разделить строки и запустить их каждый раз? – Ghost

0

Предполагая, что вы используете рубин 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" 

Вам все еще нужно, чтобы определить, какие символы разрешены для каждого случая и добавить обработку ошибок тоже.

Смежные вопросы