Доступ к данным сопоставления
В этом разделе объясняется, как использовать данные сопоставления, чтобы узнать, что было сопоставлено последним поиском или операцией сопоставления, если она прошла успешно.
Вы можете запросить весь текст сопоставления или конкретную скобочную подстроку регулярного выражения. Аргумент 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) ; The beginning of the match ⇒ 4 ; with ‘qu’ is at index 4.
(match-beginning 2) ; The beginning of the match ⇒ 6 ; with ‘ick’ is at index 6.
(match-end 1) ; The end of the match ⇒ 6 ; with ‘qu’ is at index 6. (match-end 2) ; The end of the match ⇒ 9 ; with ‘ick’ is at index 9.
Вот еще один пример. Указатель изначально расположен в начале строки. Поиск перемещает указатель между пробелом и словом «in». Начало всего сопоставления находится на 9-м символе буфера («T»), а начало сопоставления для первой подстроки — на 13-м символе («c»).
(list
(re-search-forward "The \\(cat \\)")
(match-beginning 0)
(match-beginning 1))
⇒ (17 9 13)
---------- Buffer: foo ----------
I read "The cat ∗in the hat comes back" twice.
^ ^
9 13
---------- Buffer: foo ----------
(В этом случае возвращаемый индекс — позиция в буфере; первый символ буфера считается как 1.)
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Simple-Match-Data.html