Страница 1 из 1

[Perl] Регулярное выражение

Добавлено: 2010-10-18 18:37:24
Hellboy
Добрый день. Написал бы сам, после прочтения нескольких статей по регуляркам, но боюсь не успеть со сроками общего таска. В общем, если кого не затруднит - помогите с выражением.

Есть строка типа:
бла бла бла (т.е. какой-угодно текст) Позиция: [ Первая позиция ] бла бла бла (опять какой-угодно текст).
Необходимо, чтобы в этой строке перл искал сочетание "Позиция: [" и далее выдирал все что идет до закрывающей квадратной скобки ( в нашем случае это "Первая позиция").\
Т.е. необходимо получить именно текст в квадратных скобках.

Всем заранее спасибо за проявленное внимание.

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-18 19:01:39
FreeBSP

Код: Выделить всё

/.*? Позиция: \[(.*?)\] .*?/
что то типа этого

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 17:25:30
Hellboy
FreeBSP писал(а):

Код: Выделить всё

/.*? Позиция: \[(.*?)\] .*?/
что то типа этого

Код: Выделить всё

$text = bla bla bla (sometext) Position: [ position one ] bla bla some more text;
$text = /.*? Позиция: \[(.*?)\] .*?/;
Не работает. :(

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 18:16:24
FreeBSP
правильно
что попросили то и получили
ТЗ как поставлено?
Hellboy писал(а):
бла бла бла (т.е. какой-угодно текст) Позиция: [ Первая позиция ] бла бла бла (опять какой-угодно текст).
это не похоже на
Hellboy писал(а):

Код: Выделить всё

$text = bla bla bla (sometext) Position: [ position one ] bla bla some more text;

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 18:35:46
Hellboy
Если честно, не понял разницу... Если не трудно, объясните.

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 18:51:43
FreeBSP
"Позиция" != "Position"
Hellboy писал(а):Необходимо, чтобы в этой строке перл искал сочетание "Позиция: [" и далее выдирал все что идет до закрывающей квадратной скобки

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 18:54:15
Hellboy
Простите, совсем заработался. На самом деле, скрипт, который я пробовал - это:

Код: Выделить всё

$text = bla bla bla (sometext) Position: [ position one ] bla bla some more text;
$text = /.*? Position: \[(.*?)\] .*?/;
И это не работает...

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-19 19:17:01
FreeBSP
я перла не знаю. это первый скрипт, написанной мной на перле.

Код: Выделить всё

[20:14]~/# cat test.pl                                                                                                 [/root]root@freebsp.homeip.net
#!/usr/bin/perl
$text = "bla bla bla (sometext) Position: [ position one ] bla bla some more text";
$text =~ m/.*? Position: \[(.*?)\] .*?/;

print "\"$1\"\n";
[20:14]~/# ll test.pl                                                                                                  [/root]root@freebsp.homeip.net
-rwxr-xr-x  1 root  wheel  159 19 окт 20:14 test.pl
[20:14]~/# ./test.pl                                                                                                   [/root]root@freebsp.homeip.net
" position one "

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-20 11:39:03
Hellboy
Спасибо. Действительно, уже вычитал в мануалах, что захватывающие скобки хранят полученные данные в нумерованных переменных.
Спасибо большое за помощь. Очень помогли.

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-29 13:07:16
Hellboy
Опять вернулся к той же проблеме. Не пойму, в чем дело...
Есть текст:
Folder: [STAGE]
Workflow: [wf_start_ongoing_workflows] version [1].
Workflow run status: [Running]
Workflow run error code: [0]
Workflow run id [1930496].
Folder: [LOAD_STAGE]
Workflow: [TRANSFN_INTEGN_WF_LOAD_PATIENT_VISIT_CONCAT] version [1].
Workflow run status: [Running]
Workflow run error code: [0]
Workflow run id [1929853].
Folder: [STAGE]
Workflow: [wf_start_ongoing_workflows] version [1].
Workflow run status: [Running]
Workflow run error code: [0]
Workflow run id [1930496].
Folder: [STAGE]
Workflow: [wf_some_other_workflow] version [1].
Workflow run status: [Running]
Workflow run error code: [0]
Workflow run id [1930496].
Мне необходимо:
1. Если в папке CRMRKTNG_STAGE есть запущенные workflow, но не wf_start_ongoing_workflows, то необходимо получить имя этих самых workflow.
Т.е. в данном случае я должен получить wf_some_other_workflow.

Может я действую немного запутанно и можно проще, но как я делаю:
делаю сплит всего текста по "Folder". После этого прохожу по полученному массиву и проверяю, есть ли в этом массиве строка [STAGE] Workflow: [ -- не wf_start_ongoing_workflows-- ]. Если есть, то выбираю то, что находится между квадратными скобками.
Но есть проблема. Не получается сделать проверку на наличие [STAGE] Workflow: [ -- не wf_start_ongoing_workflows-- ].

Код: Выделить всё

~m/STAGE\][^\[]+Workflow:\s+\[(wf_start_ongoing_workflows)+\]/
Вот так находит как раз те папки, в которых есть wf_start_ongoing_workflows

Соответственно, надо поступать аналогично, но противоположно, чтобы найти другие папки:

Вот так:

Код: Выделить всё

~m/STAGE\][^\[]+Workflow:\s+\[[^(wf_start_ongoing_workflows)]+\]/
- не работает.

Вот так:

Код: Выделить всё

~m/STAGE\][^\[]+Workflow:\s+\[[(wf_start_ongoing_workflows){0}+\]/
- не работает.

В чем проблема? Подскажите

Re: [Perl] Регулярное выражение

Добавлено: 2010-10-29 15:35:42
Andy
Есть сайт, вроде неплохой, посвященный теме регулярных выражений.
Быть может поможет:
http://www.regular-expressions.info/