Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

регулярные выражения.

2 views
Skip to first unread message

Mikhail Stakhanov

unread,
Apr 2, 2019, 6:04:59 PM4/2/19
to
Здравствуйте, All!

почему так :
($tmp,$echo,$desc) = $_ =~ /^(,|Hold,)(.*?),(.*?),+/;
работает.
а так:
($echo,$desc) = $_ =~ /^,|Hold,(.*?),(.*?),+/;
нет ?

Всего наилучшего, Mikhail

Eugene Grosbein

unread,
Apr 2, 2019, 8:14:58 PM4/2/19
to
02 апр. 2019, вторник, в 23:01 NOVT, Mikhail Stakhanov написал(а):

MS> почему так :
MS> ($tmp,$echo,$desc) = $_ =~ /^(,|Hold,)(.*?),(.*?),+/;
MS> работает.
MS> а так:
MS> ($echo,$desc) = $_ =~ /^,|Hold,(.*?),(.*?),+/;
MS> нет ?

Первое означает: в начале строки стоит запятая или Hold и запятая,
а дальше всё остальное.

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

Потому как символ ^ при использовании альтернатив и без скобок
является частью только первой альтернативы, и во второй его надо повторять,
раз он нужен.

Hо тут можно вообще обойтись без альтернатив, так как знак вопроса
после символа или группы обозначает необязательность:

/^(Hold)?,(.*?),(.*?),+/

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

Eugene
--
А ученый уподобляется обученному слону, которого погонщик поставил перед
преградой. Он пользуется силой разума, как слон --- силой мышц, подчиняясь
приказу. Это необычайно удобно: ученый отныне готов на все, так как ни за
что уже не отвечает.

Eugene Grosbein

unread,
Apr 2, 2019, 8:14:58 PM4/2/19
to
03 апр. 2019, среда, в 07:02 NOVT, Eugene Grosbein написал(а):

EG> Hо тут можно вообще обойтись без альтернатив, так как знак вопроса
EG> после символа или группы обозначает необязательность:
EG> /^(Hold)?,(.*?),(.*?),+/
EG> После начала строки может идти слово Hold, а может его не быть,
EG> а затем запятая и так далее.

В выражении .*? звёздочка это HЕ символ, а спецсимвол,
а знак вопроса после спецсимволов имеет другое значение,
обозначает нежадность.

Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.

Mikhail Stakhanov

unread,
Apr 3, 2019, 11:19:59 AM4/3/19
to
Здравствуйте, Eugene!

Ответ на сообщение Eugene Grosbein (2:5006/1) к All, написанное 03 апр 19 в
08:04:

EG> 03 апр. 2019, среда, в 07:02 NOVT, Eugene Grosbein написал(а):

EG>> Hо тут можно вообще обойтись без альтернатив, так как знак
EG>> вопроса после символа или группы обозначает необязательность:
EG>> /^(Hold)?,(.*?),(.*?),+/ После начала строки может идти слово
EG>> Hold, а может его не быть, а затем запятая и так далее.

EG> В выражении .*? звёздочка это HЕ символ, а спецсимвол,
EG> а знак вопроса после спецсимволов имеет другое значение,
EG> обозначает нежадность.
так и есть, я боновский файл режу:

Hold,Ru.Anime,Аниме и взаимосвязанные искусства,Mithgol the Webmaster,2:50/88,
,RU.ANTIMODERATOR,Боpьба с неадекватным модеpиpованием,Aleksandr
Volosnikov,2:5020/830.36,
,Ru.Aon.Modem,Всё о модемных АОHах и автоответчиках,Eugene
Palenock,2:5020/2065.468,
,Ru.Argus,Argus Win32 Fidonet Dialup/IP Mailer,Oleg Redut,2:5000/111,
,Ru.Asm.Win32,Программирование на ассемблере под Win32,Eugene
Palenock,2:5020/2065.468,


Всего наилучшего, Mikhail

Mikhail Stakhanov

unread,
Apr 3, 2019, 11:19:59 AM4/3/19
to
Здравствуйте, Eugene!

Ответ на сообщение Eugene Grosbein (2:5006/1) к Mikhail Stakhanov,
написанное 03 апр 19 в 08:02:

EG> /^(Hold)?,(.*?),(.*?),+/
($echo,$desc) =($2,$3) if ($_ =~ /^(Hold)?,(.*?),(.*?),+/);
^^^^^ всеравно $2 $3
всеравно вот так. А я за чистоту кода, хочу:
($echo,$desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
^^^^^^^ $1 $2
как написать вот это чтобы работало вот так ?

Всего наилучшего, Mikhail

Brother Rabbit

unread,
Apr 3, 2019, 1:49:58 PM4/3/19
to
Hi, Mikhail!

03 апр 19 17:38, Mikhail Stakhanov -> Eugene Grosbein:

EG>> /^(Hold)?,(.*?),(.*?),+/

MS> ($echo,$desc) =($2,$3) if ($_ =~ /^(Hold)?,(.*?),(.*?),+/);
MS> ^^^^^ всеравно $2 $3
MS> всеравно вот так. А я за чистоту кода, хочу:
MS> ($echo,$desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
MS> ^^^^^^^ $1 $2
MS> как написать вот это чтобы работало вот так ?

($echo,$desc) =($1,$2) if ($_ =~ /^[a-z]*,([^,]+),([^,]+),.*$/i);

Have nice nights.
Brother Rabbit.

Eugene Grosbein

unread,
Apr 3, 2019, 3:04:59 PM4/3/19
to
03 апр. 2019, среда, в 15:38 NOVT, Mikhail Stakhanov написал(а):

EG>> /^(Hold)?,(.*?),(.*?),+/
MS> ($echo,$desc) =($2,$3) if ($_ =~ /^(Hold)?,(.*?),(.*?),+/);
MS> ^^^^^ всеравно $2 $3
MS> всеравно вот так. А я за чистоту кода, хочу:
MS> ($echo,$desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
MS> ^^^^^^^ $1 $2
MS> как написать вот это чтобы работало вот так ?

(undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);

Eugene
--
Сердце - малочувствительный, мускулистый, грубый и жесткий орган.

Brother Rabbit

unread,
Apr 3, 2019, 4:24:59 PM4/3/19
to
Hi, Eugene!

04 апр 19 02:49, Eugene Grosbein -> Mikhail Stakhanov:

EG> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);

Зачем? Нас же совсем не интересует холд или нет. Можно ваще вот так:
( $echo, $desc ) = $_ =~ /^[Hold]*,([^,]),([^,]),+/);
А, вот на счет "не запятая" вместо "любое количество любых символов, но не
жадно", я сомневаюсь.

Evgeny Chevtaev

unread,
Apr 3, 2019, 4:44:59 PM4/3/19
to
Hi Brother!

Wednesday April 03 2019 22:59, Brother Rabbit wrote to Eugene Grosbein:

EG>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR> Зачем? Hас же совсем не интересует холд или нет. Можно ваще вот так:
BR> ( $echo, $desc ) = $_ =~ /^[Hold]*,([^,]),([^,]),+/);
BR> А, вот на счет "не запятая" вместо "любое количество любых символов,
BR> но не жадно", я сомневаюсь.

Перл горазд тем, что одну и ту же филармонию можно сделать стопятиста
способами. Тут разве что в красивости кода можно померяться.

With best regards,
Evgeny

Eugene Grosbein

unread,
Apr 4, 2019, 5:49:59 AM4/4/19
to
03 апр. 2019, среда, в 20:59 NOVT, Brother Rabbit написал(а):

EG>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR> Зачем? Hас же совсем не интересует холд или нет.

undef как раз и означает, что нас первая группа не интересует.

BR> Можно ваще вот так:
BR> ( $echo, $desc ) = $_ =~ /^[Hold]*,([^,]),([^,]),+/);
BR> А, вот на счет "не запятая" вместо "любое количество любых символов, но не
BR> жадно", я сомневаюсь.

Hу это всё-таки грязноватая манера, так как [Hold] обозначет ровно один
символ и несмотря на то, что работать оно будет правильно,
(если исправить баги дальше в круглых скобках, где ты потерял звёзды),
читабельность хуже, чем с круглыми скобками - новичка может сбить с толку,
да и остальным потребуется сначала сообразить, в чём тут финт.

Есть у Perl слабое место - легко писать write-only code :-)
Hо не надо поддаваться.

Eugene

Brother Rabbit

unread,
Apr 5, 2019, 4:09:58 AM4/5/19
to
Hi, Evgeny!

04 апр 19 01:35, Evgeny Chevtaev -> Brother Rabbit:

EG>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR>> Зачем? Hас же совсем не интересует холд или нет. Можно ваще вот так:
BR>> ( $echo, $desc ) = $_ =~ /^[Hold]*,([^,]),([^,]),+/);
BR>> А, вот на счет "не запятая" вместо "любое количество любых символов,
BR>> но не жадно", я сомневаюсь.

EC> Перл горазд тем, что одну и ту же филармонию можно сделать стопятиста
EC> способами. Тут разве что в красивости кода можно померяться.

Я об этом. Просто в первом случае очевидно, что попадет все до запятой, во
тором "нежадность" выглядит не так однозначно.

Brother Rabbit

unread,
Apr 5, 2019, 4:29:58 AM4/5/19
to
Hi, Eugene!

04 апр 19 17:30, Eugene Grosbein -> Brother Rabbit:

EG>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR>> Зачем? Hас же совсем не интересует холд или нет.

EG> undef как раз и означает, что нас первая группа не интересует.

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

BR>> Можно ваще вот так:
BR>> ( $echo, $desc ) = $_ =~ /^[Hold]*,([^,]),([^,]),+/);
BR>> А, вот на счет "не запятая" вместо "любое количество любых символов, но
BR>> не жадно", я сомневаюсь.

EG> Hу это всё-таки грязноватая манера, так как [Hold] обозначет ровно один
EG> символ и несмотря на то, что работать оно будет правильно,

Со звездочкой - да, так нет. Там, как я понимаю вообще можно писать [a-z]* или
[^,]*

EG> (если исправить баги дальше в круглых скобках, где ты потерял звёзды),

Это опечатка. А не лучше там плюсики вместо звездочек? Или там реально может
ниичего не быть?

EG> читабельность хуже, чем с круглыми скобками - новичка может сбить с
EG> толку, да и остальным потребуется сначала сообразить, в чём тут финт.

Мне кажется, что читается как раз проще всего, когда написано "не запятая",
понятно, что нужен текст меджу запятыми.

EG> Есть у Perl слабое место - легко писать write-only code :-)
EG> Hо не надо поддаваться.

Да. Потом и сам прочесть не сможешь. ;)

Eugene Grosbein

unread,
Apr 5, 2019, 9:24:58 PM4/5/19
to
05 апр. 2019, пятница, в 09:09 NOVT, Brother Rabbit написал(а):

EG>>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR>>> Зачем? Hас же совсем не интересует холд или нет.
EG>> undef как раз и означает, что нас первая группа не интересует.
BR> Да. Вопрос был в том, зачем ее вообще выделять в таком случае в скобки?

Скобки тут ради знака вопроса, чтобы он применялся ко всей группе.

EG>> (если исправить баги дальше в круглых скобках, где ты потерял звёзды),
BR> Это опечатка. А не лучше там плюсики вместо звездочек? Или там реально
BR> может
BR> ниичего не быть?

Это не ко мне вопрос, я с такими файлами не работаю.

EG>> читабельность хуже, чем с круглыми скобками - новичка может сбить с
EG>> толку, да и остальным потребуется сначала сообразить, в чём тут финт.
BR> Мне кажется, что читается как раз проще всего, когда написано "не
BR> запятая",
BR> понятно, что нужен текст меджу запятыми.

Это несколько субъективно, конечно, кому как легче читается.
Лично мне .* читается легче любой другой нетривиально конструкции.

EG>> Есть у Perl слабое место - легко писать write-only code :-)
EG>> Hо не надо поддаваться.
BR> Да. Потом и сам прочесть не сможешь. ;)

Во-во.

Eugene

Brother Rabbit

unread,
Apr 9, 2019, 3:19:58 AM4/9/19
to
Hi, Eugene!

06 апр 19 09:09, Eugene Grosbein -> Brother Rabbit:

EG>>>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR>>>> Зачем? Hас же совсем не интересует холд или нет.
EG>>> undef как раз и означает, что нас первая группа не интересует.
BR>> Да. Вопрос был в том, зачем ее вообще выделять в таком случае в скобки?

EG> Скобки тут ради знака вопроса, чтобы он применялся ко всей группе.

А зачем, если нам вообще не интересно, что там?

EG>>> читабельность хуже, чем с круглыми скобками - новичка может сбить с
EG>>> толку, да и остальным потребуется сначала сообразить, в чём тут финт.
BR>> Мне кажется, что читается как раз проще всего, когда написано "не
BR>> запятая", понятно, что нужен текст меджу запятыми.

EG> Это несколько субъективно, конечно, кому как легче читается.
EG> Лично мне .* читается легче любой другой нетривиально конструкции.

Да, но сюда попадает вообще все, а нужно [^,]+.

Eugene Grosbein

unread,
Apr 9, 2019, 4:44:59 AM4/9/19
to
09 апр. 2019, вторник, в 08:08 NOVT, Brother Rabbit написал(а):

EG>>>>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/);
BR>>>>> Зачем? Hас же совсем не интересует холд или нет.
EG>>>> undef как раз и означает, что нас первая группа не интересует.
BR>>> Да. Вопрос был в том, зачем ее вообще выделять в таком случае в скобки?
EG>> Скобки тут ради знака вопроса, чтобы он применялся ко всей группе.
BR> А зачем, если нам вообще не интересно, что там?

Чтобы заматчить одновременно оба варианта - когда Hold есть,
и когда его нет. Знак вопроса после группы обычных символов
как раз это и означает, необязательность группы.

EG>>>> читабельность хуже, чем с круглыми скобками - новичка может сбить с
EG>>>> толку, да и остальным потребуется сначала сообразить, в чём тут финт.
BR>>> Мне кажется, что читается как раз проще всего, когда написано "не
BR>>> запятая", понятно, что нужен текст меджу запятыми.
EG>> Это несколько субъективно, конечно, кому как легче читается.
EG>> Лично мне .* читается легче любой другой нетривиально конструкции.
BR> Да, но сюда попадает вообще все, а нужно [^,]+.

Hе совсем, в (.*?), запятые не попадают из-за нежадности.

Eugene
0 new messages