«Единственный способ творить великие дела – это любить то, что ты делаешь»
JavaScript

Игра на «Морской Бой» на JavaScript: Простая Игра и Игра для Двоих


Эта заметка посвящена созданию регулярного выражения для поиска имени сайта в строке.

Здесь можно узнать много нового о составлении регулярных выражений и закрепить материал из предыдущих заметок.

Допустим, есть переменная, содержащая несколько названий сайтов.

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";

Нужны только те, что в зоне .ru. Нужно написать регулярное выражение, которое из этого списка сайтов сможет выбрать лишь те, которые находятся в зоне .ru. Нужны полные названия сайтов.


Точка в регулярных выражениях экранируется

Решение текущей задачи следует начать с того, чтобы составить регулярное выражение для зоны .ru

Здесь стоит сказать о том, что точка . в регулярных выражениях и обозначает любой символ, кроме переноса строки (см. шпаргалку по регулярным выражениям), поэтому в нашем случае точка экранируется при помощи обратного слэша.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /\.ru/g; /* Экранируем точку + добавляем глобальный поиск g */
var result = index.match(regular); /* Ищем в строке все зоны .ru */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

Итак, пока что найдены и выведены на экран все зоны .ru кроме .RU, то есть кроме зоны записанной заглавными (прописными) буквами. Кроме этого последняя из них не относится к названию сайта (она просто расположена в конце строки и со временем будет исключена). Но сначала рассмотрим, как вывести зону с прописными буквами .RU.

Регистронезависимый шаблон i

Чтобы вывести недостающую зону .RU, снова обратимся к шпаргалке по регулярным выражениям - к группе «Модификаторы шаблонов». И воспользуемся регистронезависимым шаблоном i, благодаря которому игнорируется регистр букв.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /\.ru/gi; /* Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем в строке все зоны .ru */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

Теперь, при помощи регистронезависимого шаблона i найдены и выведены на экран все зоны .ru в том числе зона с прописным регистром букв .RU.

Диапазон [abc] (a или b или c)

Чтобы двигаться дальше в составлении регулярного выражения для поиска сайтов в строке, следует задать вопрос: что может быть перед зоной .ru?

Чтобы на него ответить, нужно знать, что в составе доменного имени могут быть только латинские буквы, цифры или дефис.

Имена доменов на кириллице сейчас учитываться не будут.

Итак, сейчас есть утверждение, что перед зоной .ru может быть любая буква латинского алфавита, любая цифра от 0 до 9 или дефис.

Снова обратимся к шпаргалке по регулярным выражениям - к группе «Диапазоны».

  • В первую очередь нас интересует диапазон [abc] (a или b или c). А в нашем случае [a-z], то есть любая латинская буква.

  • Указывая на цифру в имени сайта можно воспользоваться уже знакомым регулярным выражением \d, которое обозначает любую цифру.

    Либо дополнительно к диапазону латинских букв, добавить диапазон цифр от 0 до 9. То есть в итоге указать диапазон [a-z0-9].

  • И, наконец, в общий диапазон латинских букв и цифр можно добавить дефис
    [a-z0-9-].

Вернемся к нашему примеру и дополним регулярное выражение.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /[a-z0-9-]\.ru/gi; /* Диапазон из букв, цифр и тире. Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате вместе с зоной .ru на экран выведен лишь первый символ, который стоит перед ней и который попадает в диапазон [a-z0-9-]. Как вывести остальные?

Квантор {n,} (n или больше)

Итак, как дополнить регулярное выражение [a-z0-9-]\.ru, чтобы при поиске сайта в строке вывести на экран все символы из диапазона [a-z0-9-], расположенные перед зоной .ru?

Здесь помогут «Кванторы» из шпаргалки по регулярным выражениям.

Зная о том, что в имени домена, перед зоной .ru должно быть хотя бы 2 символа, воспользуемся квантором {2,}, который означает «2 или больше».

Может иметь место такой квантор {n,m} - с двумя параметрами, например, {2,100}. В этом случае он будет учитывать диапазон от 2 до 100 символов.

Возвращаемся к предыдущему примеру и дополняем в нем регулярное выражение.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /[a-z0-9-]{2,}\.ru/gi; /* Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате мы увидим названия сайтов, то есть все символы, которые расположены перед зоной .ru были учтены, за исключением протоколов http:// и https://, а также не хватает префикса www и точки после www. Идем далее.

Ищем www. и http:// - Квантор ? - 0 или 1

В первую очередь следует добавить в регулярное выражение поиск www и точки после этих трех букв.

Казалось бы здесь все просто. Зная о том, что точка в регулярных выражениях экранируется, нужно всего лишь к общему выражению добавить следующую запись: www\.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /www\.[a-z0-9-]{2,}\.ru/gi; /* www. + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

В результате мы видим лишь сайт с www., так как регулярное выражение www\.[a-z0-9-]{2,}\.ru подразумевает, что www. является обязательным элементом шаблона, по которому осуществляется поиск.

Но как видно из исходной переменной index, префикс www. вместе с точкой вовсе не являются обязательными символами в доменном имени сайта. И, кроме этого, они не должны повторяться более одного раза. Учитывая это, выражение www\. следует дополнить.

Для этого снова обратимся к шпаргалке по регулярным выражениям, откуда на этот раз возьмем квантор ?, который означает «0 или 1». В нашем случае 0 будет говорить о том, что www. не является обязательным элементом шаблона (т.е. этих символов может и не быть), а 1 - что если www. и встречается в доменном имени сайта, то лишь один раз.

В итоге мы получим следующее: (www\.)?.

То же самое относится и к протоколам http:// и https:// - к ним также следует применить квантор ?. Не забываем экранировать слэши.

Записи для протоколов будут такими: (http:\/\/)? и (https:\/\/)?. Смотрим пример ниже.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /(https:\/\/)?(http:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru/gi; /* Протоколы и www. если и встречаются, то лишь 1 раз + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

И в последнем примере, который будет рассмотрен в рамках этой заметки, будет сокращено общее регулярное выражение за счет использования для обоих протоколов http:// и https:// одной записи:

Вместо (http:\/\/)? и (https:\/\/)? запись будет следующей: (https?:\/\/)?

Отдельно для буквы s действует квантор ?. Смотрим пример.

Фрагмент кода

<script type="text/javascript">

var index = "У меня есть 5 сайтов: www.mysite.ru, www.mysite.com, http://my-site.ru, https://my-site-2pc.ru и Mysite.RU. Мне нужны только те, что в зоне .ru";
var regular = /(https?:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru/gi; /* Протоколы и www. если и встречаются, то лишь 1 раз + Диапазон из букв, цифр и тире в количестве от 2 и более символов... Экранируем точку + добавляем глобальный поиск g + игнорируем регистр i */
var result = index.match(regular); /* Ищем шаблон в строке */

for(i = 0; i < result.length; i++) /* Выводим элементы массива result на экран при помощи цикла for */
{
document.write(result[i] + "<p>");
}

</script>

Результат

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

(https?:\/\/)?(www\.)?[a-z0-9-]{2,}\.ru

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

Давайте еще раз коротко его опишем:

  • (https?:\/\/)? - это часть шаблона ищет в строке http:// или https://. Первый квантор ? применим к букве s, второй квантор ? говорит о том, что протокола http:// или https:// может и не быть, а если он есть, то встречается один раз.

    Оба слэша здесь экранируются обратным слэшем.

  • (www\.)? - эта часть шаблона ищет в строке www. И снова используется квантор ?

    При этом точка экранируется обратным слэшем.

  • [a-z0-9-]{2,} - здесь осуществляется поиск диапазона из латинских букв, цифр, среди которых может быть и дефис [a-z0-9-]. А запись {2,} говорит о том, что этих символов должно быть как минимум два или больше.

    В имени сайта может встретиться и под домен. Например, вот так: www.subdomain.mysite.ru. Тогда к диапазону [a-z0-9-] нужно будет добавить точку, при этом не забываем ее экранировать. Вот так: [a-z0-9-\.].

  • \.ru - наконец, мы ищем зону .ru и экранируем точку.

Отзывы и комментарии:

Комментариев нет...

Оставить отзыв:

Ваше Имя:

Текст комментария:

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

Сколько дней в Високосном году?


Объект String
Поиск сайта в строке
1015
Свойство length - Число символов в строке
1980
Практическая задача - Свойство length
799
Регистр строки - toUpperCase и toLowerCase
19978
Практическая задача - Методы toUpperCase и toLowerCase
875
Поиск совпадений в строке - Методы indexOf и lastIndexOf
1771
Практическая задача - Методы indexOf и lastIndexOf
849
Метод slice - Копирование из строки
1864
Практическая задача - Метод slice
926
Методы charAt и charCodeAt - Возвращаем символ и КОД символа
4696
Практическая задача - Методы charAt и charCodeAt
2334
Метод search - Регулярные выражения
1692
Регулярные выражения - Начало и Конец строки
1352
Практическая задача - Регулярные выражения
670
Метод match - Возвращает массив из совпадений - Глобальный поиск g
2248
Практическая задача с кредитной картой
509
Метод replace - Замена совпадений
3145
Практическая задача - Метод replace
1572
Метод trim в - Удаление пробелов в начале и конце строки
3888
Метод substring - Извлекает часть строки
628
Метод split в JavaScript - Разделитель строки
854
Последние заметки
Популярные заметки