Сведения о вопросе

Oleksandr

12:25, 12th August, 2020

Теги

regex    

Назначение {1} в этом регулярном выражении для сопоставления протоколов url

Просмотров: 512   Ответов: 4

Я читал этот вопрос о том, как разобрать URLs из веб-страниц и имел вопрос о принятом ответе , который предлагал это решение:

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

Решение было предложено csmba , и он приписал его regexlib.com . Вот так так. Кредиты сделаны.

Я думаю, что это довольно наивное регулярное выражение, но это прекрасная отправная точка для создания чего-то лучшего. Но, мой вопрос заключается в следующем:

В чем смысл {1} ? Это означает "точно одна из предыдущих группировок", верно? Разве это не поведение по умолчанию группировки в регулярном выражении? Будет ли выражение изменено каким-либо образом, если {1} будет удален?

Если бы я увидел это от коллеги, я бы указал на его ошибку, но когда я пишу это, ответ оценивается в 6, а выражение на regexlib.com оценивается как 4 из 5. Так, может быть, я что-то упустил?



  Сведения об ответе

DINO

12:56, 8th August, 2020

@ Роб: я не согласен. Чтобы обеспечить выполнение того, что вы просите, я думаю, вам нужно будет использовать negative-look-behind, что возможно, но, безусловно, не связано с использованием {1}. Ни одна из версий регулярного выражения не решает эту конкретную проблему.

Чтобы позволить коду говорить:

tibook 0 /home/jj33/swap > cat text
Text this is http://example.com text this is
Text this is http://http://example.com text this is
tibook 0 /home/jj33/swap > cat p
#!/usr/bin/perl

my $re1 = '((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)';
my $re2 = '((mailto\:|(news|(ht|f)tp(s?))\://)\S+)';

while (<>) {
  print "Evaluating: $_";
  print "re1 saw \$1 = $1\n" if (/$re1/);
  print "re2 saw \$1 = $1\n" if (/$re2/);
}
tibook 0 /home/jj33/swap > cat text | perl p
Evaluating: Text this is http://example.com text this is
re1 saw $1 = http://example.com
re2 saw $1 = http://example.com
Evaluating: Text this is http://http://example.com text this is
re1 saw $1 = http://http://example.com
re2 saw $1 = http://http://example.com
tibook 0 /home/jj33/swap >

Итак, если есть разница между двумя версиями, это не похоже на то, что вы предлагаете.


  Сведения об ответе

JUST___

11:09, 27th August, 2020

Я не думаю, что {1} имеет какую-либо действительную функцию в этом regex.

(**mailto: / (новости / (ht|f) tp (s?))://) {1}**

Вы должны прочитать это как: "capture the stuff in the parens exactly one time". Но мы действительно не заботимся о захвате этого для использования позже, например $1 в замене. Так что это бессмысленно.


  Сведения об ответе

DAAA

16:16, 10th August, 2020

Я не думаю, что это имеет какую-то цель. Но поскольку RegEx почти невозможно understand/decompose, люди редко указывают на ошибки. Вероятно, именно поэтому никто больше не обратил на это внимания.


  Сведения об ответе

9090

14:01, 3rd August, 2020

@Jeff Этвуд, ваша интерпретация немного не соответствует - {1} означает совпадение ровно один раз, но не влияет на "capturing" - захват происходит из - за Паренсов - фигурные скобки указывают только количество раз, когда шаблон должен соответствовать источнику-один раз, как вы говорите.

Я согласен с @Marius,, даже если его ответ немного лаконичен и может показаться легкомысленным. Регулярные выражения жестки, если вы не привыкли их использовать, и {1} в вопросе не совсем ошибка-в системах, которые его поддерживают, это означает "exactly one match". В этом смысле он действительно ничего не делает.

К сожалению, в отличие от теперь удаленной записи, это не мешает регулярному выражению соответствовать http://http://example.org, так как \S+ в конце будет соответствовать одному или нескольким символам, отличным от whitespace, включая http://example.org в http://http://example.org (проверено с помощью Python 2.5, на всякий случай, если мое чтение регулярного выражения было отключено). Итак, приведенное регулярное выражение на самом деле не самое лучшее. Я не эксперт URL, но, вероятно, что-то, ограничивающее появление ":"s и "//"S после первого, было бы необходимо (но вряд ли достаточно) для обеспечения хорошего URLs.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться