Regex для проверки, начинается ли строка с http: // или https: //


200

Я пытаюсь установить регулярное выражение, которое будет проверять начало строки, и если он содержит http://или https://должен соответствовать.

Как я могу это сделать? Я пытаюсь следующее, которое не работает:

^[(http)(https)]://

5
Если вы проверяете только начало строки, возможно, быстрее просто выполнить прямое сравнение первых нескольких символов строки с шаблонами, которые вы ищете.
templatetypedef

2
Вы создаете группу персонажей с []. Это Мах один символ, либо (, ), h, t, t, pили s. Т.е. это будет соответствовать, s://но не ht://или x://.
Феликс Клинг

2
@templatetypedef: я думаю, что чувствую преждевременную оптимизацию.
cdhowie

4
Многие современные библиотеки регулярных выражений работают очень быстро . Если нет (много) обратного отслеживания, регулярные выражения могут выгодно - или лучше - «Индекс-из» стиль подходит (ср /^x/против indexOf(x) == 0). Подходы «начинается с» стиля могут иметь меньше накладных расходов, но я подозреваю, что это редко имеет значение - выбирайте то, что является самым чистым, что очень хорошо может быть: x.StartWith("http://") || x.StartsWith("https://")- но делайте это из ясности кода, не пытаясь улучшить производительность, если это не оправдано анализ и требования :-)

Ответы:


354

Вы используете []неверно - обратите внимание, что []обозначает класс символов и поэтому будет соответствовать только одному символу. Выражение [(http)(https)]переводится как «соответствует a (, an h, a t, a t, a p, a )или an s». (Дублирующиеся символы игнорируются.)

Попробуй это:

^https?://

Если вы действительно хотите использовать чередование, используйте этот синтаксис:

^(http|https)://

В качестве входной строки PHP: $ regex = '/ ^ (https?: \ / \ /)';
Стив Таубер

9
Стив, я думаю, вы пропустили / в конце: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
На всякий случай, если какой-то орех случайно заглавными буквами http, $ regex = '/ ^ (https?: \ / \ /) / I';
Джеффки

3
Вы забыли убежать / использовать \. Так бы и было ^https?:\/\/. Я прав?
Шафизаде

4
@Shafizadeh /не является специальным символом в регулярных выражениях, только в языках, где /используется для записи буквального регулярного выражения. Например, нет необходимости экранировать /регулярные выражения при использовании C #, потому что регулярные выражения C # выражаются (частично) как строковые литералы. Они также не нужны, скажем, в Perl (при использовании альтернативного разделителя, как в m#^https?://#). Итак, чтобы непосредственно обратиться к вашему комментарию: (а) Нет, я не забыл что-либо избежать. (б) Вам нужно будет избегать любых персонажей, которые рассматриваются специально на выбранном вами языке.
cdhowie


25
^https?://

Возможно, вам придется избежать косой черты, в зависимости от контекста.




0

Это будет работать и для строк в кодировке URL.

^(https?)(:\/\/|(\%3A%2F%2F))

0

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

Вот что я должен был сделать, чтобы заставить его работать в asp.net RegularExpressionValidator :

[Hh][Tt][Tt][Pp][Ss]?://(.*)

Ноты:

  • (?i)и использование /whatever/iне сработало, вероятно, потому что JavaScript не принес всех чувствительных к регистру функциональности
  • Первоначально имел ^в начале, но это не имело значения, но (.*)сделал (Expression не работал без, (.*)но работал без ^)
  • Не нужно убегать, //хотя это может быть хорошей идеей.

Вот полный RegularExpressionValidator, если вам это нужно:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.