Регулярные выражения GNU Octave

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.

Автор: Владимир Кореньков
Правильная ссылка: 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 =
53 78
e =
73 112
te =
{
[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
)


Tip-icon.gif

Замечание! В общем случае не существует единого алгоритма написания регулярных выражений, т.е. к одному и тому же результату можно придти используя различные шаблоны. Касательно шаблонов, используемых в данной статье, то в учебных целях они представляются в "упрощенном и развернутом виде" (естественно, их можно усовершенствовать).


Теперь касательно параметров функции 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, " "])


[править] Дополнительная информация

  1. Фридл Дж. Регулярные выражения. Библиотека программиста. — СПб.: Питер, 2001. 352 с. ISBN 5-318-00056-8.


Octave GNU Octave

Инсталляция | Синтаксис языка | Командная строка
Скрипты | Функции | Регулярные выражения | Массивы | Графики | Ввод/вывод данных
Распределенные вычисления | Численные методы | Сплайны