когда суб остановка в Perl Regex - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь перевести некоторый Perl-код в Python, и я столкнулся с некоторой проблемой с определенным регулярным выражением. Я просто не могу понять, что он делает или почему он останавливается

это регулярное выражение

$url =~ s/^.*\///;

теперь я попытался передать несколько URL-адресов и посмотреть, что получится

так вот что получается

# string input
"http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"

# string output
"test.cgi?u=USER&p=PASS"

Я действительно не знаю, почему это останавливается на test, насколько я понимаю, он заменяет любой символ в начале строки ничем так почему он останавливается на тесте?

И если вы можете помочь мне написать регулярное выражение в Python, который делает то же самое это было бы круто

Заранее спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Я действительно не знаю, почему он останавливается на 'test', насколько я понимаю, он заменяет любой символ в начале строки ничем, так почему он останавливается на test?

Из-за того, что \/ является частью шаблона.

#            V here
$url =~ s/^.*\///;

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

$url =~ s{^.*/}{};

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

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

use re 'debug';

my $url = "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS";

$url =~ s{^.*/}{};

Выводится в STDERR.

Compiling REx "^.*/"
Final program:
   1: SBOL /^/ (2)
   2: STAR (4)
   3:   REG_ANY (0)
   4: EXACT </> (6)
   6: END (0)
floating "/" at 0..9223372036854775807 (checking floating) anchored(SBOL) minlen 1 
Matching REx "^.*/" against "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
Intuit: trying to determine minimum start position...
  doing 'check' fbm scan, [0..54] gave 5
  Found floating substr "/" at offset 5 (rx_origin now 0)...
  (multiline anchor test skipped)
Intuit: Successfully guessed: match at offset 0
   0 <> <http://per>         |   0| 1:SBOL /^/(2)
   0 <> <http://per>         |   0| 2:STAR(4)
                             |   0| REG_ANY can match 54 times out of 2147483647...
  31 <org/c> </test.cgi?>    |   1|  4:EXACT </>(6)
  32 <rg/c/> <test.cgi?u>    |   1|  6:END(0)
Match successful!
Freeing REx: "^.*/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...