← Назад к вопросам

Как обозначить конец в регулярном выражении?

1.0 Junior🔥 101 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обозначение конца строки в регулярных выражениях

В регулярных выражениях для обозначения конца строки используется специальный символ — якорь (anchor). В PHP, как и в большинстве реализаций регулярных выражений (PCRE — Perl Compatible Regular Expressions), для этого применяется символ $. Этот символ указывает, что предшествующий шаблон должен соответствовать концу строки или конца строки перед завершающим символом перевода строки.

Основные способы использования $

1. Простое совпадение с концом строки:

$pattern = '/end$/';
// Совпадение будет, если строка заканчивается на "end"
preg_match($pattern, "This is the end", $matches); // Совпадение есть
preg_match($pattern, "end of story", $matches);    // Совпадения нет

2. Комбинация с другими якорями: Часто $ используется вместе с якорем начала строки ^ для точного соответствия всей строки:

$pattern = '/^exact match$/';
preg_match($pattern, "exact match", $matches); // Совпадение есть
preg_match($pattern, "exact match ", $matches); // Совпадения нет (пробел в конце)

3. Учет режимов модификаторов: Поведение $ может меняться в зависимости от модификаторов регулярного выражения:

  • По умолчанию $ соответствует только концу строки
  • С модификатором /D (PCRE_DOLLAR_ENDONLY) $ соответствует только абсолютному концу строки, игнорируя символ перевода строки \n
  • С модификатором /m (PCRE_MULTILINE) $ соответствует концу каждой строки в многострочном тексте
$text = "Line 1\nLine 2\nLine 3";
$pattern_single = '/Line 3$/';
$pattern_multiline = '/Line 3$/m';

preg_match($pattern_single, $text, $matches);   // Совпадение есть
preg_match_all($pattern_multiline, $text, $matches); // Найдет все три строки

Особенности и важные нюансы

Экранирование символа $: Если вам нужно найти символ $ как литерал, его необходимо экранировать:

$pattern = '/100\$/'; // Ищет "100$" в тексте

Различие между $ и \z, \Z: В PCRE существуют дополнительные якоря для более точного указания конца:

  • \Z — конец строки или позиция перед последним переводом строки (если он есть)
  • \z — абсолютный конец строки без исключений
$pattern1 = '/end\Z/'; // Совпадет с "end" и "end\n"
$pattern2 = '/end\z/'; // Совпадет только с "end", но не с "end\n"

Практический пример в PHP:

// Проверка, что строка является числом с двумя десятичными знаками
$pattern = '/^\d+\.\d{2}$/';
$tests = ["123.45", "123.456", "123.45\n"];

foreach ($tests as $test) {
    if (preg_match($pattern, $test)) {
        echo "Совпадение: '$test'\n";
    } else {
        echo "Нет совпадения: '$test'\n";
    }
}

Распространенные ошибки и лучшие практики

  1. Не путайте $ внутри символьного класса: В выражении [a-z$] символ $ означает сам символ доллара, а не конец строки.

  2. Учитывайте пробельные символы: /$/ не будет учитывать пробелы в конце строки. Если нужно их обнаружить, используйте явное указание: /\s*$/.

  3. Для многострочного режима используйте модификатор /m аккуратно, понимая, что $ будет соответствовать концу каждой внутренней строки.

  4. Валидация данных: При валидации пользовательского ввода часто используют комбинацию ^ и $ для полного соответствия шаблону:

// Валидация email (упрощенный пример)
$email_pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';

Понимание работы якоря $ и его взаимодействия с различными модификаторами является важным аспектом написания эффективных и точных регулярных выражений в PHP. Правильное использование этого символа позволяет точно позиционировать шаблоны в тексте и избегать неожиданных совпадений.

Как обозначить конец в регулярном выражении? | PrepBro