Regex перевірити, чи починається рядок з http: // або https: //


200

Я намагаюся встановити regexp, який перевірить початок рядка, і якщо він містить будь-який 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://")- але робіть це з ясності коду, а не спроби покращити продуктивність, якщо це не обґрунтовано аналіз та вимоги :-)

Відповіді:


353

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

Спробуйте це:

^https?://

Якщо ви дійсно хочете використовувати чергування, використовуйте замість цього синтаксис:

^(http|https)://

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

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

10
На всякий випадок, якщо якийсь гайок випадково має високі регістри http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee

3
Ви забули втекти / скористатися \. Так було б ^https?:\/\/. Маю рацію?
Шафізаде

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


25
^https?://

Можливо, вам, можливо, доведеться уникнути передніх косої риски, залежно від контексту.





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.