Методы contains и matches

Метод contains в библиотеке Validator.js предназначен для проверки наличия подстроки внутри строки. Он используется для базовой валидации текстовых значений, когда необходимо убедиться, что строка содержит определённый фрагмент.

Общая сигнатура

contains(str, seed [, options])
  • str — проверяемая строка
  • seed — подстрока, наличие которой требуется подтвердить
  • options — объект дополнительных параметров

Базовое поведение

В простейшем варианте метод проверяет, входит ли seed в str:

validator.contains('hello world', 'world'); // true
validator.contains('hello world', 'cat');    // false

Проверка чувствительна к регистру, если не указано иное.


Параметры options

Объект options расширяет поведение метода и позволяет уточнять условия проверки.

ignoreCase

Позволяет игнорировать регистр символов при сравнении.

validator.contains('Hello World', 'hello', { ignoreCase: true }); // true

Без этого параметра:

validator.contains('Hello World', 'hello'); // false

minOccurrences

Задаёт минимальное количество вхождений подстроки.

validator.contains('foo foo foo', 'foo', { minOccurrences: 2 }); // true
validator.contains('foo foo foo', 'foo', { minOccurrences: 4 }); // false

maxOccurrences

Ограничивает максимальное количество допустимых вхождений.

validator.contains('foo foo foo', 'foo', { maxOccurrences: 2 }); // false
validator.contains('foo foo', 'foo', { maxOccurrences: 2 }); // true

Поведение при пустых значениях

Особое внимание требуется при работе с пустыми строками:

validator.contains('', 'a'); // false
validator.contains('abc', ''); // true (в некоторых версиях считается валидным совпадением)

Такое поведение зависит от реализации и требует проверки документации конкретной версии Validator.js.


Практические сценарии использования

Метод часто применяется в следующих случаях:

  • проверка наличия обязательных ключевых слов в пользовательском вводе;
  • фильтрация сообщений по содержимому;
  • валидация текстовых полей формы;
  • ограничение контента по набору допустимых фрагментов.

Пример фильтрации:

if (validator.contains(comment, 'http')) {
  // обработка потенциальной ссылки
}

Особенности реализации

  • Проверка выполняется на уровне строки без использования регулярных выражений
  • Операция обычно имеет линейную сложность O(n) относительно длины строки
  • При большом количестве проверок рекомендуется избегать многократного вызова с одинаковыми параметрами

Ограничения метода

Метод не предназначен для сложных паттернов:

  • не поддерживает регулярные выражения
  • не умеет учитывать границы слов
  • не различает семантические контексты

Для подобных задач используется метод matches


matches

Метод matches предназначен для проверки строки на соответствие регулярному выражению. В отличие от contains, он позволяет задавать сложные правила проверки с использованием regex.

Общая сигнатура

matches(str, pattern [, modifiers])
  • str — строка для проверки
  • pattern — регулярное выражение (строка или RegExp)
  • modifiers — строка модификаторов (например, "i", "g")

Базовое использование

validator.matches('hello123', '\\d+'); // true
validator.matches('hello', '\\d+');    // false

Проверка осуществляется по совпадению хотя бы одного участка строки с шаблоном.


Использование RegExp

В качестве шаблона может передаваться объект регулярного выражения:

validator.matches('abc123', /[a-z]+\d+/); // true

Такой подход удобен при динамической сборке сложных выражений.


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

Модификаторы позволяют управлять поведением регулярного выражения.

i — игнорирование регистра

validator.matches('HELLO', 'hello', 'i'); // true

g — глобальный поиск

Хотя g редко влияет на булевый результат, он может использоваться в более сложных сценариях анализа строки.


Примеры типовых проверок

Проверка email (упрощённая)

validator.matches('user@mail.com', '^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$');

Проверка числового значения

validator.matches('12345', '^\\d+$'); // true

Проверка URL (базовая)

validator.matches('https://site.com', '^https?://');

Отличия от contains

Характеристика contains matches
Тип проверки простая подстрока регулярное выражение
Гибкость низкая высокая
Производительность выше ниже при сложных regex
Контроль формата отсутствует полный контроль

Особенности обработки

  • При использовании сложных регулярных выражений возможно существенное влияние на производительность
  • Неправильно составленные паттерны могут приводить к катастрофическому backtracking
  • Рекомендуется тестировать регулярные выражения отдельно перед интеграцией

Практические сценарии использования

Метод применяется для:

  • валидации email, телефонов, URL
  • проверки форматов идентификаторов
  • анализа пользовательского ввода
  • фильтрации данных по шаблонам

Пример проверки телефона:

validator.matches('+1234567890', '^\\+\\d{10,15}$');

Ограничения и потенциальные проблемы

  • высокая сложность некоторых regex-выражений
  • отсутствие встроенной защиты от ReDoS
  • необходимость аккуратного экранирования строковых шаблонов
  • возможные различия поведения между строковым и RegExp-входом

Рекомендации по применению

  • contains целесообразен при простой проверке наличия фрагмента
  • matches используется при строгой структурной валидации
  • для повышения читаемости сложные регулярные выражения лучше выносить в отдельные константы
  • при критичных нагрузках предпочтительны упрощённые шаблоны