35.6.2 Простой доступ к данным совпадения

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

Вы можете узнать о всём совпавшем тексте или о конкретной подвыражении в круглых скобках регулярного выражения. Аргумент count в функциях ниже указывает, о чём именно. Если count равен нулю, вы спрашиваете обо всём совпадении. Если count положителен, он указывает, какое подвыражение вас интересует.

Напомним, что подвыражения регулярного выражения — это те выражения, сгруппированные с помощью экранированных круглых скобок, ‘\(…\)’. Подвыражение с номером count находится подсчётом вхождений ‘\(’ от начала всего регулярного выражения. Первое подвыражение имеет номер 1, второе — 2 и так далее. Только регулярные выражения могут иметь подвыражения — после простого поиска строки доступна только информация о всём совпадении.

Каждый успешный поиск устанавливает данные совпадения. Поэтому вам следует запрашивать данные совпадения сразу после поиска, до вызова любой другой функции, которая может выполнить ещё один поиск. Альтернативно, вы можете сохранять и восстанавливать данные совпадения (см. Сохранение и восстановление данных совпадения) вокруг вызовов функций, которые могут выполнить другой поиск. Или используйте функции, которые явно не изменяют данные совпадения; например, string-match-p.

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

Функция: match-string count &optional in-string

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

Если последняя такая операция выполнялась над строкой с помощью string-match, то вы должны передать ту же строку в качестве аргумента in-string. После поиска или сопоставления в буфере вы должны опустить in-string или передать для него nil; но вы должны убедиться, что текущий буфер при вызове match-string — это тот, в котором вы выполняли поиск или сопоставление. Несоблюдение этого совета приведёт к неверным результатам.

Значение равно nil, если count выходит за пределы диапазона, или для подвыражения внутри альтернативы ‘\|’, которая не использовалась, или для повторения, которое повторилось ноль раз.

Функция: match-string-no-properties count &optional in-string

Эта функция подобна match-string, за исключением того, что результат не имеет текстовых свойств.

Функция: match-beginning count

Если последний поиск регулярного выражения нашёл совпадение, эта функция возвращает позицию начала совпавшего текста или его подвыражения.

Если count равен нулю, то значением является позиция начала всего совпадения. В противном случае count задаёт подвыражение в регулярном выражении, и значение функции — это начальная позиция совпадения для этого подвыражения.

Значение равно nil для подвыражения внутри альтернативы ‘\|’, которая не использовалась, или для повторения, которое повторилось ноль раз.

Функция: match-end count

Эта функция подобна match-beginning, за исключением того, что она возвращает позицию конца совпадения, а не позицию начала.

Вот пример использования данных совпадения с комментарием, показывающим позиции внутри текста:

(string-match "\\(qu\\)\\(ick\\)"
              "The quick fox jumped quickly.")
              ;0123456789
     ⇒ 4

(match-string 0 "The quick fox jumped quickly.")
     ⇒ "quick"
(match-string 1 "The quick fox jumped quickly.")
     ⇒ "qu"
(match-string 2 "The quick fox jumped quickly.")
     ⇒ "ick"

(match-beginning 1)       ; Начало совпадения
     ⇒ 4                 ;   с ‘qu’ находится на индексе 4.

(match-beginning 2)       ; Начало совпадения
     ⇒ 6                 ;   с ‘ick’ находится на индексе 6.

(match-end 1)             ; Конец совпадения
     ⇒ 6                 ;   с ‘qu’ находится на индексе 6.

(match-end 2)             ; Конец совпадения
     ⇒ 9                 ;   с ‘ick’ находится на индексе 9.

Вот ещё один пример. Точка изначально находится в начале строки. Поиск перемещает точку между пробелом и словом ‘in’. Начало всего совпадения находится на 9-м символе буфера (‘T’), а начало совпадения для первого подвыражения — на 13-м символе (‘c’).

(list
  (re-search-forward "The \\(cat \\)")
  (match-beginning 0)
  (match-beginning 1))
    ⇒ (17 9 13)

---------- Буфер: foo ----------
I read "The cat ∗in the hat comes back" twice.
        ^   ^
        9  13
---------- Буфер: foo ----------

(В этом случае возвращаемый индекс является позицией в буфере; первый символ буфера считается за 1.)