Уроки Tcl
#20: Регулярные выражения - regexp |
Tcl поддерживает операции со строками, которые используют регулярные выражения.
Здесь представлены две команды для разбора регулярных выражений:
regexp ?ключи? выражение строка ?совпПерем? ?допПерем1 ... допПеремN? | |
Выполняет поиск в строке регулярного выражения. Если параметр совпПерем задан, то часть строки, которая соответствует выражению будет скопирована в переменную совпПерем. Если допПеремN задана, то следующие совпадающие части строки будут скопированы в переменные допПерем, разбор ведётся слева направо. | |
regsub ?ключи? выражение строка замена имяПерем | |
Выполняет поиск в строке подстроки, совпадающей с регулярным выражением и заменяет его на замена. Получившийся результат записывается в имяПерем. |
Регулярные выражения могут быть описаны всего лишь несколькими правилами:
^ | Начало строки |
$ | Конец строки |
. | Единичный символ |
* | Любое количество (0-N) предыдущих символов |
+ | Любое количество, не меньше 1 предыдущих символов |
[...] | Любой символ или набор символов |
[^..] | Любой символ, не входящий в список после ^ |
(...) | Группа символов, подлежащих замене (или копированию) |
Регулярные выражения аналогичны globbing системе, которая обсуждалась в уроках 15 и 17. Основное различие - способ задания шаблонов. В globbing единственный путь задать шаблон для неизвестного текста это симовол *. Он соответствует любому количеству символов.
В регулярных выражениях символ * указывает на произвольное количество символов, предудущих *. Например, a* может соответствовать а, ааааа или пустой строке. Если симовол перед * - набор символов в квадратных скобках, то * будет соответствовать любому количеству этих символов. Например, [a-г]* соответствует аа, абвг, аабгваг, или пустой строке.
Символ + аналогичен *, за исключением того, что требует хотя бы один совпадающий символ. Например, [a-б]+ будет соответствовать а, аб, абаб, но не пустой строке.
Регулярные выражения использут квадратные скобки более эффективно, чем globbing. В системе globbing вы можете использовать квадратные скобки для указания набора символов, которые могут совпасть. Регулярные выражения включают этот метод выбора, но могут использоваться и для указания символов, которые не должны совпадать. Если первый символ после [ - степень (^), то при разборе будут считаться совпавшими символами те, которых нет в квадратных скобках.
Команда regexp аналогична команде string match. Отличие в том, что regexp может найти часть строки, совпадающей с шаблоном и поместить её в переменную совпПерем.
Regsub копирует содержимое строки в новую переменную, заменяя символы, которые соответствуют шаблону на символы заданные как замена. Если замена содержит & или \0, тогда эти символы не будут заменены. Если число за обратной дробью в промежутке от 1 до 9, то только соответствующее число символов будет оставлено без замены.
Выполните пример перед тем, как читать следующую часть урока.
Аргумент шаблон команды regexp или regsub обрабатывается в фазе подстановки интерпретатором Tcl. Если в шаблоне нет последовательностей, нуждающихся в обработке, то шаблон следует поместить в фигурные скобки. В противном случае - в двойные кавычки.
В этом примере нет последовательностей после обратной дроби, поэтому можно использовать фигурные скобки или двойные кавычки. В первых двух командах regexp примера квадратные скобки используются для задания диапазона символов, так что лучше использовать фигурные скобки.
В первой части примера ведётся поиск просто последовательности прописных букв. Поэтому совпадение "то", первые две прописные буквы.
Во втором примере первые два слова фразы были помещены в разные переменные. Последовательность ([А-Яа-я]+) выделяет любое (не меньше единицы) число заглавных или прописных букв. Скобки вокруг этой последовательности являются причиной помещения совпадающего участка в переменную допПерем. В данном случае, слово "Кто" помещено в переменную sub1.
set sample "Кто ищет - тот найдёт." set result [regexp {[а-я]+} $sample match] puts "Результат на позиции: $result совпало: $match" set result [regexp {([А-Яа-я]+) +([а-я]+)} $sample match sub1 sub2 ] puts "Результат: $result совпали: $match 1: $sub1 2: $sub2" regsub "найдёт" $sample "обретёт" sample2 puts "Новое значение: $sample2" |
Горбачев "Yurez" Юрий |