Объект Date. Работа с датами

Кроме возможности создавать свои объекты, JavaScript также предоставляет набор встроенных типов объектов, которые мы можем применять в различных ситуациях.

Объект Date позволяет работать с датами и временем в JavaScript. Существуют различные способы создания объекта Date. Первый способ заключается в использовании пустого конструктора без параметров:

var currentDate = new Date();
document.write(currentDate);

В этом случае объект будет указывать на текущую дату компьютера.

Второй способ заключается в передаче в конструктор Date количества миллисекунд, которые прошли с начала эпохи Unix, то есть с 1 января 1970 года 00:00:00 GMT:

var myDate = new Date(1359270000000);
document.write(myDate);

Третий способ состоит в передаче в конструктор Date дня, месяца и года:

var myDate = new Date("02 May 2018");
document.write(myDate); // Wed May 02 2018 00:00:00 GMT+0400 (Азербайджанское время (зима))

Если мы используем полное название месяца, то оно пишется по-английски, если используем сокращенный вариант, тогда используется формат месяц/день/год.

Четвертый способ состоит в передаче в конструктор Date всех параметров даты и времени:

var myDate = new Date(2018,11,25,18,30,20,10);
document.write(myDate);

В данном случае используются по порядку следующие параметры: new Date(год, месяц, число, час, минуты, секунды, миллисекунды). При этом надо учитывать, что отсчет месяцев начинается с нуля, то есть январь - 0, а декабрь - 11.

- Получение даты и времени

Для получения различных компонентов даты применяется ряд методов:

  • getDate(): возвращает день месяца
  • getDay(): возвращает день недели (отсчет начинается с 0 - воскресенье, и последний день - 6 - суббота)
  • getMonth(): возвращает номер месяца (отсчет начинается с нуля, то есть месяц с номер 0 - январь)
  • getFullYear(): возвращает год
  • toDateString(): возвращает полную дату в виде строки
  • getHours(): возвращает час (от 0 до 23)
  • getMinutes(): возвращает минуты (от 0 до 59)
  • getSeconds(): возвращает секунды (от 0 до 59)
  • getMilliseconds(): возвращает миллисекунды (от 0 до 999)
  • toTimeString(): возвращает полное время в виде строки

- Установка даты и времени

Кроме задания параметров даты в конструкторе для установки, мы также можем использовать дополнительные методы объекта Date:

  • setDate(): установка дня в дате
  • setMonth(): уставовка месяца (отсчет начинается с нуля, то есть месяц с номер 0 - январь)
  • setFullYear(): устанавливает год
  • setHours(): установка часа
  • setMinutes(): установка минут
  • setSeconds(): установка секунд
  • setMilliseconds(): установка миллисекунд

Объект Math. Математические операции

Объект Math предоставляет ряд математических функций, которые можно использовать при вычислениях. Рассмотрим основные математические функции.

- abs()

Функция abs() возвращает абсолютное значение числа:

var x = -25;
document.write(Math.abs(x)); // 25

var y = 34;
document.write(Math.abs(y)); // 34

- min() и max()

Функции min() и max() возвращают соответственно минимальное и максимальное значение из набора чисел:

var max = Math.max(19, 45); // 45
var min = Math.min(33, 24); // 24

Эти функции необязательно должны принимать два числа, в них можно передавать и большее количество чисел.

- ceil()

Функция ceil() округляет число до следующего наибольшего целого числа:

var x = Math.ceil(9.2); // 10
var y = Math.ceil(-5.9); // -5

Выражение Math.ceil(9.2) возвращает число 10, так как число 10 следующее наибольшее целое число после 9.2. И также выражение Math.ceil(-5.9) возвращает -5, потому что число -5 следующее наибольшее целое после -5.9.

- floor()

Функция floor() округляет число до следующего наименьшего целого числа:

var x = Math.floor(9.2); // 9
var y = Math.floor(-5.9); // -6

- round()

Функция round() округляет число до следующего наименьшего целого числа, если его десятичная часть меньше 0.5. Если же десятичная часть равна или больше 0.5, то округление идет до ближайшего наибольшего целого числа:

var x = Math.round(5.5); // 6
var y = Math.round(5.4); // 5
var z = Math.round(-5.4); // -5
var n = Math.round(-5.5); // -5
var m = Math.round(-5.6); // -6

- random()

Функция random() возвращает случайное число с плавающей точкой из диапазона от 0 до 1:

var x = Math.random();
console.log(x);  // 0.9874820803431725

- pow()

Функция pow() возвращает число в определенной степени. Например, возведем число 2 в степень 3:

var x = Math.pow(2, 3);
console.log(x);  // 8

- sqrt()

Функция sqrt() возвращает квадратный корень числа:

var x = Math.sqrt(121); // 11
var y = Math.sqrt(9); // 3

- log()

Функция log() возвращает натуральный логарифм числа:

var x = Math.log(1); // 0
var z = Math.log(10); // 2.302585092994046

- Тригонометрические функции

Целый ряд функций представляют тригонометрические функции: sin() (вычисляет синус угла), cos() (вычисляет косинус угла), tan() (вычисляет тангенс угла).

var x = Math.sin(90); // 0.8939966636005579
var y = Math.cos(0); // 1
var z = Math.tan(45); // 1.6197751905438615

Функция asin() вычисляет арксинус числа, acos - арккосинус, а atan() - арктангенс числа:

var x = Math.asin(0.9); // 1.1197695149986342
var y = Math.acos(1); // 1
var z = Math.atan(1); // 0.7853981633974483

- Константы

Кроме методов объект Math также определяет набор встроенных констант, которые можно использовать в различных вычислениях:

  • Math.PI (число PI): 3.141592653589793
  • Math.SQRT2 (квадратный корень из двух): 1.4142135623730951
  • Math.SQRT1_2 (половина от квадратного корня из двух): 0.7071067811865476
  • Math.E (число e или число Эйлера): 2.718281828459045
  • Math.LN2 (натуральный логарифм числа 2): 0.6931471805599453
  • Math.LN10 (натуральный логарифм числа 10): 2.302585092994046
  • Math.LOG2E (двоичный логарифм числа e): 1.4426950408889634
  • Math.LOG10E (десятичный логарифм числа e): 0.4342944819032518

Используем константы в вычислениях:

var x = Math.log(Math.E); // 1
var z = Math.tan(Math.PI/4); // 0.9999999999999999

Объект Array. Работа с массивами

Объект Array представляет массив и предоставляет ряд свойств и методов, с помощью которых мы можем управлять массивом.

- length

Чтобы узнать длину массива, используется свойство length:

var fruit = new Array();
fruit[0] = "яблоки";
fruit[1] = "груши";
fruit[2] = "сливы";

document.write("В массиве fruit " + fruit.length + " элемента: <br/>");

for(var i=0; i < fruit.length; i++) {
    document.write(fruit[i] + "<br/>");
}

По факту длиной массива будет индекс последнего элемента с добавлением единицы.

- slice() - копирование массива

Копирование массива может быть поверхностным или неглубоким (shallow copy) и глубоким (deep copy).

При неглубоком копировании достаточно присвоить переменной значение другой переменной, которая хранит массив:

var users = ["Tom", "Sam", "Bill"];
console.log(users);     //  ["Tom", "Sam", "Bill"]

var people = users;     //  неглубокое копирование
people[1] = "Mike";     //  изменяем второй элемент
console.log(users);     //  ["Tom", "Mike", "Bill"]

В данном случае переменная people после копирования будет указывать на тот же массив, что и переменная users. Поэтому при изменении элементов в people, изменятся элементы и в users, так как фактически это один и тот же массив.

Такое поведение не всегда является желательным. Например, мы хотим, чтобы после копирования переменные указывали на отдельные массивы. И в этом случае можно использовать глубокое копирование с помощью метода slice():

var users = ["Tom", "Sam", "Bill"];
console.log(users);             //  ["Tom", "Sam", "Bill"]

var people = users.slice();     //  глубокое копирование
people[1] = "Mike";             //  изменяем второй элемент

console.log(users);             //  ["Tom", "Sam", "Bill"]
console.log(people);            //  ["Tom", "Mike", "Bill"]

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

Также метод slice() позволяет скопировать часть массива:

var users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
var people = users.slice(1, 4);
console.log(people);        // ["Sam", "Bill", "Alice"]

В метод slice() передается начальный и конечный индексы, которые используются для выборки значений из массива. То есть в данном случае выборка в новый массив идет начиная с 1 индекса по индекс 4 не включая. И поскольку индексация массивов начинается с нуля, то в новом массиве окажутся второй, третий и четвертый элемент.

- push()

Метод push() добавляет элемент в конец массива:

var fruit = [];
fruit.push("яблоки");
fruit.push("груши");
fruit.push("сливы");
fruit.push("вишня","абрикос");

document.write("В массиве fruit " + fruit.length + " элемента: <br/>");
document.write(fruit); // яблоки,груши,сливы,вишня,абрикос

- pop()

Метод pop() удаляет последний элемент из массива:

var fruit = ["яблоки", "груши", "сливы"];
var lastFruit = fruit.pop(); // извлекаем из массива последний элемент

document.write(lastFruit + "<br/>");  // сливы
document.write("В массиве fruit " + fruit.length + " элемента: <br/>");  // В массиве fruit 2 элемента:

for(var i=0; i <fruit.length; i++) {
    document.write(fruit[i] + "<br/>");  // яблоки груши
}

- shift()

Метод shift() извлекает и удаляет первый элемент из массива:

var fruit = ["яблоки", "груши", "сливы"];
var firstFruit = fruit.shift();

document.write(firstFruit + "<br/>");  // яблоки
document.write("В массиве fruit " + fruit.length + " элемента: <br/>");  // В массиве fruit 2 элемента: 

for(var i=0; i <fruit.length; i++) {
    document.write(fruit[i] + "<br/>");  // груши сливы
}

- unshift()

Метод unshift() добавляет новый элемент в начало массива:

var fruit = ["яблоки", "груши", "сливы"];
fruit.unshift("абрикосы");
document.write(fruit);  // абрикосы,яблоки,груши,сливы

- splice() - удаление элемента по индексу

Метод splice() удаляет элементы с определенного индекса. Например, удаление элементов с третьего индекса:

var users = ["Tom", "Sam", "Bill", "Alice", "Kate"];
var deleted = users.splice(3);

console.log(deleted);       // [ "Alice", "Kate" ]
console.log(users);         // [ "Tom", "Sam", "Bill" ]

Метод slice возвращает удаленные элементы. В данном случае удаление идет с начала массива. Если передать отрицательный индекс, то удаление будет производиться с конца массива.

- concat()

Метод concat() служит для объединения массивов:

var fruit = ["яблоки", "груши", "сливы"];
var vegetables = ["помидоры", "огурцы", "картофель"];
var products = fruit.concat(vegetables);

for(var i=0; i < products.length; i++) {
    document.write(products[i] + "<br/>");  // яблоки груши сливы помидоры огурцы картофель
}

При этом необязательно объединять только однотипные массивы. Можно и разнотипные.

- join()

Метод join() объединяет все элементы массива в одну строку:

var fruit = ["яблоки", "груши", "сливы", "абрикосы", "персики"];
var fruitString = fruit.join(", ");

document.write(fruitString);  // яблоки, груши, сливы, абрикосы, персики

В метод join() передается разделитель между элементами массива. В данном случае в качестве разделителя будет использоваться запятая и пробел (", ").

- sort()

Метод sort() сортирует массив по возрастанию:

var fruit = ["яблоки", "груши", "сливы", "абрикосы", "персики"];
fruit.sort();

for(var i=0; i < fruit.length; i++) {
    document.write(fruit[i] + "<br/>");
}

Вывод в браузере:

абрикосы
груши
персики
сливы
яблоки

reverse() - переворачивает массив задом наперед.

Методы indexOf() и lastIndexOf() возвращают индекс первого и последнего включения элемента в массиве.

Метод every() проверяет, все ли элементы соответствуют определенному условию.

Метод some() похож на метод every(), только он проверяет, соответствует ли хотя бы один элемент условию. И в этом случае метод some() возвращает true. Если элементов, соответствующих условию, в массиве нет, то возвращается значение false.

Метод filter(), как some() и every(), принимает функцию условия. Но при этом возвращает массив тех элементов, которые соответствуют этому условию.

- forEach() и map()

Методы forEach() и map() осуществляют перебор элементов и выполняют с ними определенные операции. Например, для вычисления квадратов чисел в массиве можно использовать следующий код:

var numbers = [1, 2, 3, 4, 5, 6];

for(var i=0; i<numbers.length; i++) {
    var result = numbers[i] * numbers[i];

    document.write("Квадрат числа " + numbers[i] + " равен " + result + "<br/>");
}

Но с помощью метода forEach() можно упростить эту конструкцию:

var numbers = [1, 2, 3, 4, 5, 6];

function square(value, index, array) {
    var result = value * value;
    document.write("Квадрат числа " + value + " равен " + result + "<br/>");
};

numbers.forEach(square);

Метод forEach() в качестве параметра принимает все ту же функцию, в которую при переборе элементов передается текущий перебираемый элемент и над ним выполняются операции.

Метод map() похож на метод forEach, он также в качестве параметра принимает функцию, с помощью которой выполняются операции над перебираемыми элементами массива, но при этом метод map() возвращает новый массив с результатами операций над элементами массива.

Например, применим метод map к вычислению квадратов чисел массива:

var numbers = [1, 2, 3, 4, 5, 6];

function square(value, index, array) {
    return result = value * value;
};

var squareArray = numbers.map(square);
document.write(squareArray);  // 1,4,9,16,25,36

Функция, которая передается в метод map() получает текущий перебираемый элемент, выполняет над ним операции и возвращает некоторое значение. Это значение затем попадает в результирующий массив squareArray.


Объект Number. Работа с числами

Объект Number представляет числа. Чтобы создать число, надо передать в конструктор Number число или строку, представляющую число:

var x = new Number(34);
var y = new Number('34');
document.write(x+y); // 68

Определения x и y в данном случае будут практически аналогичны. Однако создавать объект Number можно и просто присвоив переменной определенное число:

var z = 34;

Объект Number предоставляет ряд свойств и методов. Некоторые его свойства:

  • Number.MAX_VALUE: наибольшее возможное целое число. Приблизительно равно 1.79E+308. Числа, которые больше этого значения, рассматриваются как Infinity
  • Number.MIN_VALUE: наименьшее возможное положительное целое число. Приблизительно равно 5e-324 (где-то около нуля)
  • Number.NaN: специальное значение, которое указывает, что объект не является числом
  • Number.NEGATIVE_INFINITY: значение, которое обозначает отрицательную неопределенность и которое возникает при переполнении. Например, если мы складываем два отрицательных числа, которые по модулю равны Number.MAX_VALUE.
  • Number.POSITIVE_INFINITY: положительная неопределенность. Также, как и отрицательная неопределенность, возникает при переполнении, только теперь в положительную сторону.

Некоторые основные методы:

  • isNaN(): определяет, является ли объект числом. Если объект не является числом, то возвращается значение true.
  • parseFloat(): преобразует строку в число с плавающей точкой. Например:
    var a = Number.parseFloat("34.90"); // 34.9
    document.write(a);
    var b = Number.parseFloat("hello"); // NaN
    document.write(b);
    var c = Number.parseFloat("34hello"); // 34
    document.write(c);
  • parseInt(): преобразует строку в целое число. Например:
    var a = Number.parseInt("34.90"); // 34
    document.write(a);
    var b = Number.parseInt("hello"); // NaN
    document.write(b);
    var c = Number.parseInt("25hello"); // 25
    document.write(c);
  • toFixed(): оставляет в числе с плавающей точкой определенное количество знаков в дробной части. Например:
    var a =  10 / 1.44;
    document.write("До метода toFixed(): " + a + "<br/>");
    a = a.toFixed(2); // оставляем два знака после запятой
    document.write("После метода toFixed(): " + a + "<br/>");
    До метода toFixed(): 6.944444444444445
    После метода toFixed(): 6.94

Объект String. Работа со строками

Для создания строк мы можем как напрямую присваивать переменной строку:

let name = "Tom";

Для работы со строками предназначен объект String, поэтому также можно использовать конструктор String:

var name = new String("Tom");

Но как правило, используется первый более краткий способ. В первом случае JavaScript при необходимости автоматически преобразует переменную примитивного типа в объект String. Объект String имеет большой набор свойств и методов, с помощью которых мы можем манипулировать строками.

Свойство length указывает на длину строки:

var hello = "привет мир";
console.log("В строке '" + hello + "' " + hello.length + " символов");  // В строке 'привет мир' 10 символов

Метод repeat() позволяет создать строку путем многократного повторения другой строки. Количество повторов передается в качестве аргумента:

let hello = "hello ";
console.log(hello.repeat(3));   // hello hello hello

- Шаблоны строк

Шаблоны строк позволяют вставлять в строку различные значения. Для этого строки заключаются в косые кавычки:

let name = "Tom";
let hello = `Hello ${name}`;
console.log(hello);     // Hello Tom

let age = 23;
let info = `${name} is ${age} years old`;
console.log(info);      // Tom is 23 years old

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

- Поиск в строке

Для поиска в строке некоторой подстроки используются методы indexOf() (индекс первого вхождения подстроки) и lastIndexOf() (индекс последнего вхождения подстроки).

Эти методы принимают два параметра:

  • Подстроку, которую надо найти
  • Необязательный параметр, который указывает, с какого символа следует проводить поиск подстроки в строке

Оба этих метода возвращают индекс символа, с которого в строке начинается подстрока. Если подстрока не найдена, то возвращается число -1.

let hello = "привет мир. пока мир";
let key = "мир";

let firstPos = hello.indexOf(key);
let lastPos = hello.lastIndexOf(key);

console.log("Первое вхождение: ", firstPos);    // 7
console.log("Последнее вхождение: ", lastPos);  // 17

Еще один метод - includes() возвращает true, если строка содержит определенную подстроку.

let hello = "привет мир. пока мир";

console.log(hello.includes("мир")); // true
console.log(hello.includes("миг")); // false

- Выбор подстроки

Для того, чтобы вырезать из строки подстроку, применяются методы substr() и substring().

Метод substring() принимает два параметра:

  • индекс символа в строке, начиная с которого надо проводить обрезку строки
  • индекс, до которого надо обрезать строку
let hello = "привет мир. пока мир";
let world = hello.substring(7, 10); // с 7-го по 10-й индекс
console.log(world); // мир

Метод substr() также в качестве первого параметра принимает начальный индекс подстроки, а в качестве второго - длину вырезаемой подстроки:

let hello = "привет мир. пока мир";
let bye = hello.substr(12, 4);
console.log(bye); // пока

Если второй параметр не указывается, то обрезается вся остальная часть строки.

- Управление регистром

Для изменения регистра имеются методы toLowerCase() (для перевода в нижний регистр) и toUpperCase() (для перевода в верхний регистр).

let hello = "Привет Том";
console.log(hello.toLowerCase()); // привет том
console.log(hello.toUpperCase()); // ПРИВЕТ ТОМ

- Получение символа по индексу

Чтобы получить определенный символ в строке по индексу, можно применять методы charAt() и charCodeAt(). Оба этих метода в качестве параметра принимают индекс символа:

let hello = "Привет Том";
console.log(hello.charAt(2));       // и
console.log(hello.charCodeAt(2));   // 1080

- Удаление пробелов

Для удаления начальных и концевых пробелов в стоке используется метод trim():

let hello = "   Привет Том  ";
let beforeLength = hello.length;
hello = hello.trim();
let afterLength = hello.length;

console.log("Длина строки до: ", beforeLength);     // 15
console.log("Длина строки после: ", afterLength);   // 10

- Объединение строк

Метод concat() объединяет две строки:

let hello = "Привет ";
let world = "мир";
hello = hello.concat(world);

console.log(hello); // Привет мир

- Замена подстроки

Метод replace() заменяет первое вхождение одной подстроки на другую:

let hello = "Добрый день";
hello = hello.replace("день", "вечер");

console.log(hello); // Добрый вечер

Первый параметр метода указывает, какую подстроку надо заменить, а второй параметр - на какую подстроку надо заменить.

- Разделение строки

Метод split() разбивает строку на массив подстрок по определенному разделителю. В качестве разделителя используется строка, которая передается в метод:

var message = "Сегодня была прекрасная погода";
var stringArray = message.split(" ");

for(var str in stringArray) {
    console.log(stringArray[str]);
}
Сегодня
была
прекрасная
погода

- Проверка начала и окончания строки

Метод startsWith() возвращает true, если строка начинается с определенной подстроки. А метод endsWith() возвращает true, если строка оканчивается на определенную подстроку.

let hello = "let me speak from my heart";

console.log(hello.startsWith("let"));       // true
console.log(hello.startsWith("Let"));       // false
console.log(hello.startsWith("lets"));      // false

console.log(hello.endsWith("heart"));       // true
console.log(hello.startsWith("bart"));      // false

При этом играет роль регистр символов, и из примера выше мы видим, что "let" не эквивалентно "Let".

Дополнительный второй параметр позволяет указать индекс (для startsWith - индекс с начала, а для endsWith - индекс с конца строки), относительно которого будет производиться сравнение.


Объект RegExp. Регулярные выражения

Регулярные выражения представляют шаблон, который используется для поиска или модификации строки. Для работы с регулярными выражениями в JavaScript определен объект RegExp.

Определить регулярное выражение можно двумя способами:

var myExp = /hello/;
var myExp = new RegExp("hello");

Используемое здесь регулярное выражение довольно простое: оно состоит из одного слова "hello". В первом случае выражение помещается между двумя косыми чертами, а во втором случае используется конструктор RegExp, в который выражение передается в виде строки.

Чтобы определить, соответствует ли регулярное выражение строке, в объекте RegExp определен метод test(). Этот метод возвращает true, если строка соответствует регулярному выражению, и false, если не соответствует:

var initialText = "hello world!";
var exp = /hello/;
var result = exp.test(initialText);
document.write(result + "<br/>"); // true

initialText = "beautifull wheather";
result = exp.test(initialText);
document.write(result); // false - в строке initialText нет "hello"

Аналогично работает метод exec - он также проверяет, соответствует ли строка регулярному выражению, только теперь данный метод возвращает ту часть строки, которая соответствует выражению. Если соответствий нет, то возвращается значение null.

- Свойства выражений

  • Свойство global позволяет найти все подстроки, которые соответствуют регулярному выражению. По умолчанию при поиске подстрок регулярное выражение выбирает первую попавшуюся подстроку из строки, которая соответствует выражению. Хотя в строке может быть множество подстрок, которые также соответствуют выражению. Для этого применяется данное свойство в виде символа g в выражениях
  • Свойство ignoreCase позволяет найти подстоки, которые соответствуют регулярному выражению, вне зависимости от регистра символов в строке. Для этого в регулярных выражениях применяется символ i
  • Свойство multiline позволяет найти подстроки, которые соответствуют регулярному выражению, в многострочном тексте. Для этого в регулярных выражениях применяется символ m

- Метасимволы

Регулярные выражения также могут использовать метасимволы - символы, которые имеют определенный смысл:

  • \d: соответствует любой цифре от 0 до 9
  • \D: соответствует любому символу, который не является цифрой
  • \w: соответствует любой букве, цифре или символу подчеркивания (диапазоны A–Z, a–z, 0–9)
  • \W: соответствует любому символу, который не является буквой, цифрой или символом подчеркивания (то есть не находится в следующих диапазонах A–Z, a–z, 0–9)
  • \s: соответствует пробелу
  • \S: соответствует любому символу, который не является пробелом
  • .: соответствует любому символу

Так, стандартный формат номера телефона +1-234-567-8901 соответствует регулярному выражению \d-\d\d\d-\d\d\d-\d\d\d\d.

- Модификаторы

Кроме выше рассмотренных элементов регулярных выражений есть еще одна группа комбинаций, которая указывает, как символы в строке будут повторяться. Такие комбинации еще называют модификаторами:

  • {n}: соответствует n-ому количеству повторений предыдущего символа. Например, h{3} соответствует подстроке "hhh"
  • {n,}: соответствует n и более количеству повторений предыдущего символа. Например, h{3,} соответствует подстрокам "hhh", "hhhh", "hhhhh" и т.д.
  • {n,m}: соответствует от n до m повторений предыдущего символа. Например, h{2, 4} соответствует подстрокам "hh", "hhh", "hhhh"
  • ?: соответствует одному вхождению предыдущего символа в подстроку или его отсутствию в подстроке. Например, /h?ome/ соответствует подстрокам "home" и "ome"
  • +: соответствует одному и более повторений предыдущего символа
  • *: соответствует любому количеству повторений или отсутствию предыдущего символа
  • ^: соответствует началу строки. Например, ^h соответствует строке "home", но не "ohma", так как h должен представлять начало строки
  • $: соответствует концу строки. Например, м$ соответствует строке "дом", так как строка должна оканчиваться на букву м

Например, возьмем номер того же телефона. Ему соответствует регулярное выражение \d-\d\d\d-\d\d\d-\d\d\d\d. Однако с помощью выше рассмотренных комбинаций мы его можем упростить: \d-\d{3}-\d{3}-\d{4}

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