forum.wfido.ru

forum.wfido.ru (http://forum.wfido.ru/index.php)
-   RU.UNIX.BSD (http://forum.wfido.ru/forumdisplay.php?f=36)
-   -   вопрос по регулярному выражению (http://forum.wfido.ru/showthread.php?t=54235)

Victor Sudakov 22.09.2018 08:52

вопрос по регулярному выражению
 
Victor Sudakov написал(а) к All в Sep 18 11:38:56 по местному времени:

Dear All,

Для nginx на замену апачевскому mod_userdir предлагается такое решение: [url]https://pastebin.com/fwkzb9jz[/url]
Например в [url]https://websiteforstudents.com/enable-userdir-apache2-nginx-ubuntu-17-04-17-10/[/url] и ещё много где оно приводится.

Что означает "?" внутри первых скобок, или иначе спрошу, к чему он относится?

Victor Sudakov, VAS4-RIPE, VAS47-RIPN
--- GoldED+/BSD 1.1.5-b20160322-b20160322

Yury Ivliev 22.09.2018 12:56

Re: вопрос по регулярному выражению
 
Yury Ivliev написал(а) к Victor Sudakov в Sep 18 10:34:48 по местному времени:

From: Yury Ivliev <ii@any.com.ru>

Нi, Victor!

On Sat, 22 Sep 2018 11:38:56 +0300,
Victor Sudakov <Victor.Sudakov@f49.n5005.z2.fidonet.org> wrote:
VS> Что означает "?" внутри первых скобок, или иначе спрошу, к чему
VS> он относится?
perl -a -e 'm,^/~(.+)(/.*)?$,; print "user: $1\n"'
/~qqqq/qqq/qq
user: qqqq/qqq/qq

perl -a -e 'm,^/~(.+?)(/.*)?$,; print "user: $1\n"'
/~qqqq/qqq/qq
user: qqqq

То есть "?" уменшает "вес" первой части выражения (".+").

Тут можно ещё так:
perl -a -e 'm,^/~([^/]+)(/.*)?$,; print "user: $1\n"'
/~qqqq/qqq/qq
user: qqqq
--- ifmail v.2.15dev5.4

Eugene Grosbein 22.09.2018 12:56

Re: вопрос по регулярному выражению
 
Eugene Grosbein написал(а) к Victor Sudakov в Sep 18 15:44:38 по местному времени:

22 сент. 2018, суббота, в 09:38 NOVT, Victor Sudakov написал(а):

VS> Для nginx на замену апачевскому mod_userdir предлагается такое решение:
VS> [url]https://pastebin.com/fwkzb9jz[/url]
VS> Например в
VS> [url]https://websiteforstudents.com/enable-userdir-apache2-nginx-ubuntu-17-04-17-10/[/url]
VS> и ещё много где оно приводится.
VS> Что означает "?" внутри первых скобок, или иначе спрошу, к чему он относится?

ngnix использует не POSIX regexp, в которых .+? не является тем, что тут нужно,
он использует Perl regexp, где сочетание +? явно определено в man perlre:

By default, a quantified subpattern is "greedy", that is, it will match
as many times as possible (given a particular starting location) while
still allowing the rest of the pattern to match. If you want it to
match the minimum number of times possible, follow the quantifier with
a "?". Note that the meanings don't change, just the "greediness":

*? Match 0 or more times, not greedily
+? Match 1 or more times, not greedily
?? Match 0 or 1 time, not greedily
{n}? Match exactly n times, not greedily (redundant)
{n,}? Match at least n times, not greedily
{n,m}? Match at least n but not more than m times, not greedil

То есть, в выражении ^/~(.+?)(/.*)?$ часть (.+?) матчит нежадно и оставляет
возможный второй прямой слеш в строке второй группе скобок.
Скорее всего, жадный вариант оставлял бы всегда пустой вторую группу.

Eugene
--- slrn/1.0.3 (FreeBSD)

Eugene Grosbein 22.09.2018 12:56

Re: вопрос по регулярному выражению
 
Eugene Grosbein написал(а) к Yury Ivliev в Sep 18 16:06:34 по местному времени:

22 сент. 2018, суббота, в 08:34 NOVT, Yury Ivliev написал(а):

YI> Тут можно ещё так:
YI> perl -a -e 'm,^/~([^/]+)(/.*)?$,; print "user: $1\n"'
YI> /~qqqq/qqq/qq
YI> user: qqqq

Я, кстати, предпочитаю именно этот вариант, так как он
корректен и для POSIX regexp тоже.

Eugene
--- slrn/1.0.3 (FreeBSD)

Alex Korchmar 22.09.2018 20:22

Re: вопрос по регулярному выражению
 
Alex Korchmar написал(а) к Eugene Grosbein в Sep 18 19:04:01 по местному времени:

From: Alex Korchmar <noreply@linux.e-moe.ru>

Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org> wrote:

> То есть, в выражении ^/~(.+?)(/.*)?$ часть (.+?) матчит нежадно и оставляет
> возможный второй прямой слеш в строке второй группе скобок.
> Скорее всего, жадный вариант оставлял бы всегда пустой вторую группу.
while still allowing the rest of the pattern to match. не всегда
пустой, но всегда только последний /и то что после, все непоследние
/ и между ними достались бы первой.

но да, позиксная семантика с явным ^/ тут ничем не хуже, и непонятно, нафига
была нужна эта невнятица.


> Alex

--- ifmail v.2.15dev5.4


Текущее время: 17:43. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot