Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #19: Обработка строк - tolower toupper trim format

#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"

Следующий урок - #21: Использование регулярных выражений
Горбачев "Yurez" Юрий  
Хостинг от uCoz