Приоритеты операций в регулярных выражениях



В регулярных выражениях по умолчанию установлен следующий приоритет операций (в порядке убывания):

· Экранирование символа \

· Круглые и квадратные скобки () []

· Квантификаторы ? + * { }

· Конкатенация и привязка к началу/концу строки ^ $

· Объединение |

 

Примеры использования регулярных выражений

1. Нахождение слова WORD, стоящего в начале, конце или середине строки:

(^|[ ]) WORD ([^ a-zA-Z0-9 ]|$)

 

2. Нахождение положительных и отрицательных вещественных чисел, записанных с точкой или запятой:

[ +- ]?( 0 |[ 1-9 ][ 0-9 ]*)[ ., ][ 0-9 ]+

 

3. Нахождение предложений, заканчивающихся многоточием '…':

[ A-Za-z0-9 ]\ . { 3 }$

 

4. Нахождение бинарных векторов, длина которых кратна 3:

([ 01 ]{ 3,3 })+

(( 0 | 1 ){ 3,3 })+

(( 0 | 1 )( 0 | 1 )( 0 | 1 ))+

 

Команда grep и регулярные выражения

Команда grep может работать с базовыми регулярными выражениями. Существует ее разновидности:

egrep – функция, работающая с расширенным набором регулярных выражения (за исключением оператора \{ \});

fgrep (fast grep) – вместо поиска выражений, соответствующих шаблону, выполняет поиск фиксированных строк.

При работе команды grep с регулярными выражениями (то есть с образцами, включающими специальные символы), шаблон поиска следует заключать в одинарные кавычки ' '. В этом случае все метасимволы, содержащиеся в шаблоне, гарантированно не будут интерпретированы shell как собственные, а будут обработаны исключительно командой grep.

Если необходимо найти строки, полностью совпадающие с образцом, выполнение команды следует производить с ключом –x. В этом случае шаблону

 $ grep -x 'a bc '

будет соответствовать только слово abс, в то время как запущенная без ключа команда

$ grep 'a bc '

будет также определять слова и строки AAabсCC, abсAAA и пр. так как в них содержится образец. Естественно, использование метасимволов ^ и $ совместно с ключом –х не имеет смысла за исключением случая поиска пустой строки ^ $.

Важной особенностью команды grep является то, что включаемые в состав шаблона команды метасимволы регулярных выражений

{ } ( ) | + ?

интерпретируются ей как обычные символы. Если есть необходимость интерпретировать их как специальные, следует использовать ключ – Е, который обеспечивает расширенный диапазон метасимволов регулярных выражений (работа в режиме команды egrep). Так команде grep

$ grep -x 'ab|cd'

будет соответствовать строка ab |cd, в то время, как команда

$ grep -xЕ ' ab|cd '

позволит находить строки ab и cd так как знак | будет интерпретироваться командой как метасимвол.

 

 

ГЛАВА 3. ОБРАБОТКА ВРЕМЕНИ И ДАТЫ

Обработка времени и даты на языке Cи

Для работы с системной датой и временем в языке Си используется библиотека time.h, которая содержит типы и функции для работы с датой и временем.

Библиотека time.h определяет два основных типа объектов:

Clock_t

Time_t

Эти типы данных служат для представления времени в удобном для произведения арифметических операций виде, а именно в виде некоторого целого числа, называемого календарным временем. Величины типа clock_t имеют наивысшую точность, возможную для компьютера, а точность величин типа time_t составляет одну секунду.

Кроме этого в библиотеке содержится структура tm, которая содержит дату и время с разбиением на компоненты.

Также в заголовочном файле time . h определен тип данных size _ t, который соответствует целому беззнаковому типу данных и используется для отображения количества символов строки. Он используется в качестве параметра и значения возврата функцией strftime ().

 

Основные функции работы со временем

Функция time()

Функция time () возвращает текущее календарное время системы. Если в системе отсчет времени не производится, возвращается значение -1.

time_t time (time_t * t1);

Функцию time() можно вызывать либо с нулевым указателем, либо с указателем на переменную типа time_t. В последнем случае этой переменной будет присвоено календарное время. Будучи вызванной с параметром NULL, она возвращает число секунд, прошедших с 01.01.1970. Это – дата основания операционной системы UNIX (по крайней мере, так принято считать).

 

 time_t t1;

 time(&t1);

 time_t t2=time(NULL);

 time_t t3;

 t3=time(NULL);

 

В результате работы этой программы в переменные t 1, t 2 и t 3 будут занесено целое число, значение которого определяет число секунд от 01.01.1970 до текущего времени.

 

Функция ctime() / ctime_ r()

В качестве аргумента функции передается указатель на переменную типа time _ t. Возвращает функция указатель на строку, содержащую информацию о дате и времени.

char * ctime( const time_t * t1);

Функция преобразует значение типа time_t в строку, которая содержит дату и время в человеко-понятном формате:

Ннн Ммм дд чч: мм: сс гггг

где:
Ннн – это день недели;
Ммм – месяц;
дд – день;
чч:мм:сс – время (часы, минуты, секунды);
гггг – год. В конце строки стоит завершающий нулевой символ ‘\0’ и символ новой строки ‘\n’.

Например: Thu Oct 22 20:55:11 2015

Пример использования функции:

printf("%s", ctime(&t1));

Функция возвращает указатель на строку, таким образом, можно присвоить результат ее работы строке:

char *pr;

pr=ctime(&t1);

printf("pr=%s", pr);

 

Полученная в результате работы команды строка может быть сразу занесена в предварительно созданную строку при помощи команды ctime _ r().

char * ctime_r( const time_t * t1, char * pr1);

Здесь первый аргумент t 1 является переменной типа time _ t, значение которого преобразуется в строку и заносится в переменную pr 1). Пример:

char pr1[26];

ctime_r(&t1,pr1);

printf("pr1=%s", pr1);

 

Функция difftime()

Возвращает в формате double разность в секундах между временем t1 и временем t2 (то есть t1 - t2). Формат команды имеет вид:

double difftime(time_t t1, time_t t2);

Пример работы:

#include <stdio.h>

#include <time.h>

int main()

{

int i, n;

double dif;

time_t t1=time(NULL);

time_t t2;

 

for (i=0; i<30000; i++)

printf ("Wait…\n");

time(&t2);

dif=difftime(t2, t1);

printf("dif=%f\n", dif);

return 0;

}

 

В результате работы программы будет выведено число, соответствующее времени выполнения цикла.

Указанные выше функции позволяют определять число секунд и выводить результат в удобной для пользователя форме, однако не позволяют работать с данными о дате и времени. Для возможности не только вывода на экран данных о времени, но и обработки соответствующих полей, библиотека time . h содержит специальную структуру tm, содержащую все поля времени и даты в виде целочисленных значений.

Структура tm имеет вид:

struct tm

{

int tm_sec;          // секунды после минут [0,59]

int tm_min;             // минуты после часов [0,59]

int tm_hour;        // часы после полуночи [0,23]

int tm_mday;           // день месяца [1,31]

int tm_mon;        // месяц года (январь = 0) [0,11]

int tm_year;         // год (1900 год = 0)

int tm_wday;            // день недели (вс = 0) [0,6]

int tm_yday;         // день года (1 января = 0) [0,365]

int tm_isdst;          // флаг перехода на летнее время (Daylight Saving Time) = 0

                                 // если не действует, в противном случае действует

};

 

Структура – это сложный тип данных представляющий собой упорядоченное в памяти множество элементов различного типа. Каждый элемент в структуре имеет свое имя и называется полем. В Си элементы структуре располагаются последовательно, а размер структуры определяется суммой размеров всех элементов.

Объявление в Си структуры имеет вид:

struct [имя типа]

{

поле_1;

поле_2;

...

поле_N;

} [список переменных];

 

Объявление полей структуры возможно только без инициализации. Если несколько полей следующих друг за другом в описании структуры имеют один и тот же тип, то для их описания можно использовать синтаксис объявления нескольких переменных одного и того же типа. Типом поля может быть любой тип (как системный, так и пользовательский), описанный ранее.

Пример структуры в Си, содержащей информацию о точке в двумерном пространстве (координаты):

  struct Point

  {

   double x, y;

  };

 

Допускается создание объектов типа структура после описания или одновременно. В первом случае необходимо создать экземпляр

struct Point A;

во втором случае имя экземпляра указывается в момент описания структуры

struct Point

  {

   double x, y;

  }A;

 

Имена объектов могут быть указаны через запятую:

struct Point

  {

   double x, y;

  }A, B, C;

 

Если объект типа структуры создавался в момент инициализации, то позже также можно задавать другие экземпляры той же структуры.

Обращение к полям структуры осуществляется в следующем виде:

  <имя_переменной>.<имя_поля>

Например,

A.x=10;

Для работы со структурой tm в библиотеке time . h содержаться следующие функции.

 

Функции localtime() и gmtime()

Функция localtime() возвращает текущее время (или переданное в параметре) с учётом временной зоны (т. е. смещения часового пояса);


Функция gmtime() отдаёт текущее время (или переданное в параметре), без учёта смещения временной зоны — мировое время (UTC+0/GMT+0).

Функция localtime() преобразует время в секундах, истекшее с 0 часов 1 января 1970 года (показание системных часов CLOCK_REALTIME) в местное (с учетом часового пояса) время и дату.

Функция gmtime() преобразует системное время в секундах в дату и всемирное координированное время.

Результат работы обеих функций помещается в структуру типа tm и функция возвращает указатель на эту структуру.

#include <stdio.h>

#include <time.h>

 

int main()

{

time_t t1=time(NULL);

struct tm *tm1;

tm1 = gmtime (&t1);

// tm1 = localtime (&t1);      // аналогичный результат, но с учетом часового пояса

printf("%s\n",asctime(tm1));

return 0;

}

 

Имеются модификации функций localtime _ r() и gmtime _ r() позволяющие заносить результат работы в структуру.

Функция asctime() / asctime_ r()

Функция asctime () эквивалентна ctime(), единственное их отличие – передаваемый параметр (в первом случае функции передается структура tm, во втором – переменная типа time _ t).

Функция asctime() преобразует локальное время, представленное в виде структуры типа struct tm, в текстовую строку.

char * asctime(const struct tm *t1);

char * asctime_r(const struct tm *t1, char *pr1);

 

Функция mktime()

Эта функция обратная функции localtime(). Функция mktime() на основе данных, содержащихся в структуре tm, рассчитывает время в секундах, истекшее с 0 часов 1 января 1970 года. Если mktime() не может представить информацию в необходимом формате, она позвращает значение -1. Функция имеет формат

time_t mktime(struct tm * t);

Функция возвращает переменную типа time _ t.

#include <stdio.h>

#include <time.h>

 

int main ()

{

struct tm t; // Структура с местным временем

// Заполняем структуру. Для заполнения используем дату: Sat May 18 14:12:09 2014

t.tm_sec = 9;

t.tm_min = 12;

t.tm_hour = 14;

t.tm_mday = 18;

t.tm_mon = 4;

t.tm_year = 114;

t.tm_wday = 6;

t.tm_yday = 137;

t.tm_isdst = 0;

printf ("Time %ld sec\n", mktime(&t));

return 0;

}

 

Кроме того, функция mktime() по некоторым исходным значениям времени восстанавливает значения остальных членов структуры t.

Исходные значения членов структуры tm_wday и tm_yday из t игнорируются. Диапазоны значений для остальных членов структуры ограничиваются их нормальными значениями (например, диапазон значений tm_mday находится между 1 и 31).

В случае ошибки функция возвращает значение -1.

Пример:

#include <time.h>                                                                 

#include <stdio.h>                                                         

int main(int argc, char* argv[])

{                                       

struct tm t;        

t.tm_mday = 6;                         

t.tm_mon = 10;                    

t.tm_year = 115;

//t.tm_sec = t.tm_min = t.tm_hour = t.tm_isdst = 0;              

mktime(&t);

printf("%s",asctime(&t));

return 0;              

}

 

Написанная выше программа выдаст некорректный результат, например, Tue Jan 1 12:05:45 2494! Для корректной работы программы необходимо ввести значение времени и установить флаг перехода на летнее время. В противном случае функция mktime() преобразует случайным образом определенные часы, минуты и секунды, увеличивая значения даты.

Для правильной работы программы необходимо добавить строку

t.tm_sec = t.tm_min = t.tm_hour = t.tm_isdst = 0;

В этом случае результат работы программы будет

Fri Nov 6 00:00:00 2015

 

Функция strftime()

Функция strftime преобразует время, представленное в виде структуры типа struct tm, на которую указывает аргумент t, в текстовую строку str.
Выходная текстовая строка формируется в соответствии с форматом, на который указывает аргумент str_form. В конце строки помещается нулевой символ (признак конца строки).


size_t strftime (char *str, size_t maxsize, const char *str_form, const struct tm *t);

где str – указатель на строку в которую будет помещен результат преобразования;
maxsize – длина строки, на которую указывает аргумент str;
str_form – формат преобразования даты и времени;
t – структура типа tm, содержащая дату и время для преобразования.

Если дата и время успешно преобразованы и длина полученной строки не превышает maxsize, то функция возвращает длину полученной строки, иначе возвращается 0, при этом содержимое строки, на которую указывает аргумент str будет неопределенно.

Строка, содержащая формат преобразования, может содержать как обычные символы, так и спецификаторы (аналогично формату функции printf(), но с другими значениями). Обычные символы копируются в выходную строку без изменения, спецификаторы заменяются на соответствующие данные из структуры, на которую указывает аргумент t. При преобразовании используются следующие спецификаторы, представленные в таблице 3.1.

Таблица 3.1

Спецификаторы, используемые в функции strftime()

Спецификатор Значение
%a сокращенное название дня недели (например, Sun)
%A полное название дня недели (например, Sunday)
%b сокращенное название месяца (например, Dec)
%B полное название месяца (например, December)
%c дата и время (например, Dec 2 06:55:15 1979)
%d день месяца (например, 02)
%H час в 24-часовом диапазоне (например, 06)
%I час в 12-часовом диапазоне (например, 06)
%j день года начиная с 001 (например, 335)
%m месяц начиная с 01 (например, 12)
%M минуты (например, 55)
%p AM/PM индикатор, AM - означает до полудня, PM - после полудня
%S секунды (например, 15)
%U номер недели с начала года (с воскресенья до понедельника), начиная с 00 (например, 48)
%w номер дня недели, воскресенью соответствует 0 (например, 6)
%W номер недели с начала года (с понедельника до воскресенья), начиная с 00 (например, 47)
%x дата (например, Dec 2 1979)
%X время (например, 06:55:15)
%y последние две цифры года (например, 79)
%Y год (например, 1979)
%Z часовой пояс (например, EST)
%% символ процента %

 

В примере, представленном ниже, в консоль выводятся дата, день недели, время, часовой пояс, полученные с помощью функции strftime().

#include <stdio.h>

#include <time.h>

int main (void)

{   

long int s_time;                             // Переменная для системного времени

struct tm *m_time;                        // Указатель на структуру с локальным временем

char str_t[128]="";                        // Строка для сохранения преобразованного времени

s_time = time(NULL);                           // Считываем системное время

m_time = localtime(&s_time);           // Преобразуем системное время в локальное

strftime (str_t, 128, "Date: %x %A %X %Z", m_time);  

                                                            // Преобразуем локальное время в текстовую строку

printf ("%s\n", str_t);                   // Выводим строку в консоль

return 0;

}


Дата добавления: 2020-01-07; просмотров: 454; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!