Регулярные выражения GNU Octave
Материал из Xgu.ru
Автор: Владимир Кореньков
Правильная ссылка: http://xgu.ru/wiki/octave/re
Содержание |
[править] Основные понятия
Наиболее часто решаемыми задачами при обработке текстовой информации (например, файла с исходными данными) является поиск фрагментов, удовлетворяющих заданным условиям, и выполнение над ними некоторых операций (удаления, замены на другой фрагмент, извлечения для дальнейшего использования и т. п.). Условия поиска можно достаточно просто выразить в виде своеобразной "формулы", что-то наподобие: найти в тексте все слова, состоящие из 4-х цифр, разделенных точкой, и находящихся в конце строки. Для формализованной записи подобных условий используются регулярные выражения - по сути представляющие собой набор правил для описания текстовых строк.
В пределах одной статьи невозможно рассказать обо всем многообразии мира регулярных выражений, поэтому перед изучением дальнейшего материала "непосвященным" рекомендуется предварительно ознакомится c 1
[править] Шаблоны
Необходимо отметить, что язык Octave содержит все "стандартные" операторы.
\ | - экранирование (считать следующий метасимвол как обычный символ) |
. | - один произвольный символ, кроме \n - конец строки |
^ | - начало строки |
$ | - конец строки |
| | - альтернатива (логическое ИЛИ) |
( ) | - оператор группирования выражений |
[ ] | - обозначение класса (списка) символов |
\w | - алфавитно-цифровой символ (любая буква, цифра или символ подчеркивания "_") |
\W | - любой символ, кроме буквы, цифры или символа подчеркивания "_" |
\s | - соответствует любому "пробельному" символу (пробел, табуляция, символ новой строки и т.п.) |
\S | - любой символ, кроме "пробельного" |
\d | - соответствует цифре |
\D | - соответствует любому символу, кроме цифры |
\b | - граница слова |
\B | - отсутствие границы слова |
\< | - начало слова |
\> | - конец слова |
* | - выражение повторяется 0 или большее число раз |
+ | - повторяется 1 или большее число раз |
? | - 0 или 1 раз |
{n} | - точно n раз |
{n,} | - по меньшей мере 1 раз |
{n,m} | - повторяется не меньше n, но и не больше m раз |
[править] Функции проверки совпадения
Синтаксис:
[s, e, te, m, t, nm] = regexp (str, pat)
где str - строка в которой ищется совпадение, pat - шаблон поиска.
Значение s, e, te, m, t, nm проще объяснить на следующем примере.
Пример 1. Поиск web-адресов в строке
> String = "Additional information about Octave is available at http://www.octave.org or http://www.gnu.org/software/octave/";
> Pattern = '(http\:\/\/[a-z./]+)';
> [s,e,te,m,t,nm] = regexp(String, Pattern)
s =
e =
- 53 78
te =
- 73 112
{
}
- [1,1] = 53 73
- [1,2] = 78 112
m =
{
}
- [1,1] = http://www.octave.org
- [1,2] = http://www.gnu.org/software/octave/
t =
{
}
- [1,1] =
- {
- [1,1] = http://www.octave.org
- }
- [1,2] =
- {
- [1,1] = http://www.gnu.org/software/octave/
- }
Начнем по-порядку, с разбора регулярного выражения:
( | - скобки используются для ссылки на найденный текст |
http | - web-адрес должен начинаться с названия протокола http |
\: | - экранируем символ двоеточия ":" |
\/\/ | - экранируем символы слэш "//" |
[a-z./] | - web-адрес может включать любую латинскую строчную букву и/или символ "." либо "/" |
+ | - таких сочетаний должно быть >= 1 |
) |
Замечание! В общем случае не существует единого алгоритма написания регулярных выражений, т.е. к одному и тому же результату можно придти используя различные шаблоны. Касательно шаблонов, используемых в данной статье, то в учебных целях они представляются в "упрощенном и развернутом виде" (естественно, их можно усовершенствовать). |
Теперь касательно параметров функции regexp:
s | - позиция в строке первого символа совпадения шаблона (в данном случае с позиции 53 начинается адрес http://www.octave.org, а с 78 - http://www.gnu.org/software/octave/) |
e | - позиция в строке последнего символа совпадения шаблона (на позиции 73 заканчивается подстрока http://www.octave.org, а 112 - http://www.gnu.org/software/octave/) |
te | - массив содержащий позиции начала и конца каждого фрагмента (фактически сочетание предыдущих двух параметров) |
m | - содержит текст каждой успешно найденной подстроки по шаблону |
t | - содержит текст каждой успешно найденной ссылки на текст: подстроки, заключенной в шаблоне в скобки "( )" |
Более подробный пример см. в разделе Текстовый формат GNU Octave.
[править] Функции подстановки фрагментов
Синтаксис:
string = regexprep (str, pat, repstr, options)
Данная функция заменяет в строке str фрагмент текста, соответствующий шаблону pat на текст repstr и при необходимости присваивает новый результат переменной string.
Пример 2. Преобразование даты: замена числового обозначения на название месяца
> # строка, которую будем заменять
> date = "24.02.1980";
> # выделяем подстроку, соответствующую обозначению месяца
> [s, e, te, m, t, nm] = regexp (date, '[0-9]+\.([0-9]+)\.[0-9]+');
> month = t{1}{1};
> # преобразовываем в число (чтоб не делать лишних проверок, т.к. возможны обозначения "2" или "02")
> switch str2num(month)
> case (1) s = " января ";
> case (2) s = " февраля ";
> case (3) s = " марта ";
> case (4) s = " апреля ";
> case (5) s = " мая ";
> case (6) s = " июня ";
> case (7) s = " июля ";
> case (8) s = " августа ";
> case (9) s = " сентября ";
> case (10) s = " октября ";
> case (11) s = " ноября ";
> case (12) s = " декабря ";
> endswitch
> # заменяем подстроку ".02." на " февраля "
> date = regexprep (date, '\.([0-9]+)\.', s)
24 февраля 1980
Недостатком приведенного выше примера является то, что заменяя подстроку ".02." на " февраля ", мы вынуждены пробельные символы вводить в переменную s перед и после названия месяца, что не совсем корректно. Во избежание подобной ситуации, можно воспользоваться внутренними переменными для ссылки на текст:
Если в шаблоне pat встречаются группирующие скобки "( )", то их содержимое присваивается переменной "$<порядковый номер>". Например, для pat = '(\d+)(\w+)' в переменной $1 будет содержаться набор цифр, а в $2 - букв.
Таким образом более грамотным в примере №2 будет запись в s названий месяцев без пробельных символов, и замена последней строки на
date = regexprep (date, '(\.)([0-9]+)(\.)', [" ", s, " "])
[править] Дополнительная информация
- Фридл Дж. Регулярные выражения. Библиотека программиста. — СПб.: Питер, 2001. 352 с. ISBN 5-318-00056-8.
GNU Octave Инсталляция |
Синтаксис языка |
Командная строка
|
---|