Голословный reg comp php. Man regcomp (3): функции регулярных выражений POSIX. Сообщение об ошибках POSIX

Содержание

ereg

ereg -- парное значение регулярного выражения
Описание
int ereg (string pattern, string string, array );

Ищет парные значения string в регулярном выражении, указанном в pattern .

Если парные значения найдены для подстрок в круглых скобках pattern и функция вызывалась с третьим аргументом regs , то парные значения будут сохранены в элементах regs . $regs будет содержать подстроку, которая начинается с первой левой круглой скобки; $regs будет содержать подстроку, начинающуюся со второй скобки и т.д. $regs будет содержать копию string .

Поиск чуствителен к регистру.

Функция возвращает true, если парное значение для pattern было найдено в string, или false, если не было найдено парных значений или произошла ошибка.

Следующий код извлекает дату в ISO формате и выводит в формате DD.MM.YYYY:

Example 1. ereg() example

If (ereg("({4})-({1,2})-({1,2})", $date, $regs)) { echo "$regs.$regs.$regs"; } else { echo "Invalid date format: $date"; }

ereg_replace

ereg_replace -- заменяет регулярное выражение
Описание
string ereg_replace (string pattern, string replacement, string string);

Эта функция сканирует string на парные значения к pattern , затем заменяет найденный текст на replacement .

Если pattern содержит подстроки в круглых скобках, то replacement может содержать подстроки вида \\ цифра , которые будут заменены текстом, совпадающим с цифровой подстрокой в скобках; \\0 обработает все содержимое строки. Может быть использовано до 9 подстрок. Скобки могут быть сгруппированы, в этом случае они считаются по открывающим скобкам. Например, следующий код напечатет "This was a test" три раза:

Пример 1. ereg_replace()

$string = "This is a test"; echo ereg_replace(" is", " was", $string); echo ereg_replace("()is", "\\1was", $string); echo ereg_replace("(()is)", "\\2was", $string);

См. также , , и .

eregi

eregi -- нечувствительный к регистру поиск парных значений в регулярных выражениях
Описание
int eregi (string pattern, string string, array );

eregi_replace

eregi_replace -- замена регулярного выражения без учета регистра
Описание
string eregi_replace (string pattern, string replacement, string string);

split

split -- разбивает строку на массив по регулярному выражению
Описание
array split (string pattern, string string, int );

Возвращает массив строк, каждая из которых является подстрокой строки, образованные разбитием этой строки на части, отделенные друг от друга pattern . Если произойдет ошибка, функция вернет false.

Для получения первых 5 полей из строки в /etc/passwd:

Будет выдано .

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

Для работы с регулярными выражениями в С/С++ создана библиотека regex.h. В ней предопределены основные функцкии:

#include int regcomp (regex_t *restrict preg, const char *restrict pattern, int cflags); int regexec (const regex_t *restrict preg, const char *restrict string, size_t nmatch, regmatch_t pmatch , int eflags); void regfree (regex_t *preg); size_t regerror (int errcode, const regex_t *restrict preg, char *restrict errbuf, size_t errbuf_size);

Функция regcomp предназначена для компиляции регулярного выражения. Эта функция компилирует регулярное выражение pattern учитывая флаги cflags и помещает его в структуру preg.
Флаги могут быть составлены как побитовое или следующих элементов:

  • REG_EXTENDED - использовать расширенные регулярные выражения
  • REG_ICASE - не различать заглавные и строковые буквы при сопоставлении строки с регулярным выражением

Функция regexec сопоставляет регулярное выражение скомпилированное и помещённое в структуру preg со строкой string. При этом в случае успешного сопоставления возвращается нулевое значение, в протичном случае - код ошибки. Аргумент eflags - побитовое ИЛИ REG_NOTBOL и REG_NOTEOL. Они определяет, являются ли границы цепочки границами строки (для обработки фиксаторов ^ и $). Если аргумент nmatch равен нулю, то pmatсh игнорируется, иначе он должен указывать на массив nmatch элементов, который будет заполнен смещениями подцепочек.

Для расшифровки ошибок используется функция regerror() . Она преобразует errcode возвращённый сопоставлением регулярного выражения и строки и помещает строковое значение ошибки в переменную errbuf, при этом следует указывать её размер.

Функция regfree() освобождает память запрошенную при компилировании регулярного выражения. Указатель на структуру регулярного выражения использовать после этого нельзя...

Рассмотрим пример:

#include #include using namespace std; #define PATTERN "^{0,3}.{0,3}.{0,3}.{0,3}$" #define STRING "127.0.0.1" int main() { regex_t preg; int err,regerr; err = regcomp (&preg, PATTERN, REG_EXTENDED); if (err != 0) { char buff; regerror(err, &preg, buff, sizeof(buff)); cout << buff; } regmatch_t pm; regerr = regexec (&preg, STRING, 0, &pm, 0); if (regerr == 0) cout << "true"; else { cout << "false\n"; char errbuf; regerror(regerr, &preg, errbuf, sizeof(errbuf)); cout << errbuf; } return 0; }

Эта функция - простейшая функция для распознания IP адреса. При помощи директивы define мы предоприделили строку с регулярным выражением и строку для проверки. В главной функции прежде всего компилируется регулярное выражение PATTERN и помещается в структуру preg. Сразу проверяем наличие ошибок и если они есть, выводим на экран. После этого сравниваем строку STRING с регулярным выражением в preg. В случае совпадения выводим "true", в противном случае - "false" и расшифровуем ошибку при помощи regerror.

Format

#include int regcomp(regex_t *_restrict_ preg , const char *_restrict_ pattern , int cflags );

General description

Compiles the regular expression specified by pattern into an executable string of op-codes.

preg is a pointer to a compiled regular expression.

pattern is a pointer to a character string defining a source regular expression (described below).

cflags is a bit flag defining configurable attributes of compilation process: REG_EXTENDED Support extended regular expressions. REG_ICASE Ignore case in match. REG_NEWLINE Eliminate any special significance to the newline character. REG_NOSUB Report only success or fail in regexec(), that is, verify the syntax of a regular expression. If this flag is set, the regcomp() function sets re_nsub to the number of parenthesized sub-expressions found in pattern . Otherwise, a sub-expression results in an error.

The regcomp() function under z/OS XL C/C++ will use the definition of characters according to the current LC_SYNTAX category. The characters, [ , ] , { , } , | , ^ , and $ , have varying code points in different encoded character sets.

Regular expressions

The functions regcomp(), regerror(), regexec(), and regfree() use regular expressions in a similar way to the UNIX awk, ed, grep, and egrep commands.

The simplest form of regular expression is a string of characters with no special meaning. The following characters do have special meaning; they are used to form extended regular expressions: Symbol Description . The period symbol matches any one character except the terminal newline character. [character character ] The hyphen symbol, within square brackets, means “through”. It fills in the intervening characters according to the current collating sequence. For example, can be equivalent to or, with a different collating sequence, it can be equivalent to . [string ] A string within square brackets specifies any of the characters in string . Thus , if compared to other strings, would match any that contained a, b, or c.

No assumptions are made at compile time about the actual characters contained in the range.

{m } {m ,} {m ,u } Integer values enclosed in {} indicate the number of times to apply the preceding regular expression. m is the minimum number, and u is the maximum number. u must not be greater than RE_DUP_MAX (see limits.h).

If you specify only m , it indicates the exact number of times to apply the regular expression. {m ,} is equivalent to {m,u }. They both match m or more occurrences of the expression.

* The asterisk symbol indicates 0 or more of any characters. For example, [ a*e ] is equivalent to any of the following: 99ae9, aaaaae, a999e99. $ The dollar symbol matches the end of the string. (Use \n to match a newline character.) character + The plus symbol specifies one or more occurrences of a character. Thus, smith+ern is equivalent to, for example, smithhhern . [^string ] The caret symbol, when inside square brackets, negates the characters within the square brackets. Thus [^abc] , if compared to other strings, would fail to match any that contains even one a, b, or c. (expression )$n Stores the value matched by the enclosed regular expression in the (n +1) th ret parameter. Ten enclosed regular expressions are allowed. Assignments are made unconditionally. (expression ) Groups a sub-expression allowing an operator, such as *, +, or .], to work on the sub-expression enclosed in parentheses. For example, (a*(cb+)*)$0 .

Note:

  1. Do not use multibyte characters.
  2. You can use the ] (right square bracket) alone within a pair of square brackets, but only if it immediately follows either the opening left square bracket or if it immediately follows [^. For example: –] matches the ] and – characters.
  3. All the preceding symbols are special . You precede them with \ to use the symbol itself. For example, a\.e is equivalent to a.e .
  4. You can use the – (hyphen) by itself, but only if it is the first or last character in the expression. For example, the expression --0] matches either the ] or else the characters – through 0. Otherwise, use \–.

Returned value

If successful, regcomp() returns 0.

If unsuccessful, regcomp() returns nonzero, and the content of preg is undefined.

Example

CELEBR07 ⁄* CELEBR07 This example compiles an extended regular expression. *⁄ #include #include #include #include main() { regex_t preg; char *string = "a simple string"; char *pattern = ".*(simple).*"; int rc; if ((rc = regcomp(&preg, pattern, REG_EXTENDED)) != 0) { printf("regcomp() failed, returning nonzero (%d)", rc); exit(1); } }

#include
#include
int regcomp(regex_t * preg , const char * regex , int cflags );
int regexec(const regex_t * preg , const char * string , size_t nmatch ,
regmatch_t pmatch , int eflags );
size_t regerror(int errcode , const regex_t * preg , char * errbuf ,
size_t errbuf_size );
void regfree(regex_t * preg );

ОПИСАНИЕ

Компилирование регулярных выражений POSIX

Функция regcomp () используется для компиляции регулярного выражения в формат, который подходит для последующих поисков с помощью regexec ().

regcomp () передаётся указатель на область хранения буферного шаблона preg , указатель на заканчивающуюся null строку regex и флаги cflags , используемые для определения типа компиляции.

Все поиски регулярных выражений должны выполняться с помощью скомпилированного буферного шаблона, поэтому regexec () должна всегда вызываться с адресом буферного шаблона, инициализированного функцией regcomp ().

Значение cflags может состоять из поразрядного or нуля или нескольких следующих значений:

REG_EXTENDED Использовать синтаксис расширенных регулярных выражений POSIX во время интерпретации regex . Если не включён этот флаг, то используется синтаксис простых регулярных выражений POSIX. REG_ICASE Не учитывать регистр. Последующие поиски regexec () с использованием данного буферного шаблона не будут зависеть от регистра. REG_NOSUB Не сообщать положение совпадений. Параметры nmatch и pmatch для regexec () игнорируются, если данный буферный шаблон был скомпилирован с этим включённым флагом. REG_NEWLINE Операторы совпадения с любым символом не совпадают с символом новой строки.

Список несовпадающих символов ([^...] ) без символа новой строки не совпадает с новой строкой.

Оператор сравнения по началу строки (^ ) совпадает с пустой строкой сразу после новой строки независимо от того, что eflags , флаги выполнения regexec (), содержат REG_NOTBOL .

Оператор сравнения по концу строки ($) совпадает с пустой строкой до символа начала строки независимо от того, что eflags содержит REG_NOTEOL .

Сравнение с регулярным выражением POSIX

Функция regexec () используется для сравнения строки, завершающейся null, с предварительно обработанным буферным шаблоном preg . Аргументы nmatch и pmatch используются для предоставления информации о местонахождении любых совпадений. Значение eflags может быть поразрядным ИЛИ одного или обоих значений REG_NOTBOL и REG_NOTEOL . Данные значения определяют поведение процесса сравнения так, как описано ниже. REG_NOTBOL Оператор сравнения по началу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE ). Этот флаг может использоваться, когда в regexec () передаются отдельные части строки, и начало такой строки в данном случае не должно интерпретироваться как начало новой строки. REG_NOTEOL Оператор сравнения по концу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE ).

Байтовые смещения

Если REG_NOSUB не установлен при компиляции буферного шаблона, то возможно получать информацию о положении совпадений. Значение pmatch должно быть определено так, чтобы иметь, по крайней мере, nmatch элементов. Они заполняются regexec () адресами внутристрочных совпадений. Смещения подвыражения, начинающегося с i -й открытой скобки, сохраняется в pmatch[i] . Адрес совпадения всего регулярного выражения сохраняется в pmatch (заметим, что чтобы вернуть смещения совпадений N подвыражений, значение nmatch должно быть не менее N+1 ). Любые неиспользованные элементы структуры будут содержать значение -1.

Структура regmatch_t , являющаяся типом pmatch , определена в :

Typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t;

Каждый элемент rm_so , не равный -1, показывает начальное смещение следующего совпадения наибольшей подстроки внутри заданной строки. Относительный элемент rm_eo указывает на смещение конца совпадения, которое является первым символом после совпавшего текста.

Сообщение об ошибках POSIX

Функция regerror используется для преобразования кодов ошибок, которые могут быть получены от regcomp () и regexec (), в строки сообщений об ошибках.

В regerror передаются: код ошибки errcode , буферный шаблон preg , указатель на символьный буфер строки errbuf и размер буфера строки errbuf_size . Функция возвращает размер errbuf , который требуется для сохранения сообщения об ошибке в виде строки, оканчивающейся null. Если и errbuf , и errbuf_size не равны нулю, то errbuf заполняется первыми errbuf_size - 1 символами сообщения об ошибке и завершается байтом null ("\0").

Освобождение буфера шаблона POSIX

Функция regfree () освобождает память, отведённую буферному шаблону preg во время процесса компиляции с помощью regcomp ().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция regcomp () возвращает ноль при успешной компиляции или в противном случае код ошибки.

Функция regexec () возвращает ноль при совпадении или REG_NOMATCH , если совпадений не было.

ОШИБКИ

Функция regcomp () может возвращать следующие ошибки: REG_BADBR Неправильное использование оператора обратных ссылок. REG_BADPAT Неправильное использование операторов шаблона, таких, как операторы группы или списка. REG_BADRPT Неправильное использование операторов повторения, например, использование «*» в качестве первого символа. REG_EBRACE Непарные скобки в операторах интервала. REG_EBRACK Непарные квадратные скобки в операторах списка. REG_ECOLLATE Неправильный элемент сортировки. REG_ECTYPE Неизвестное имя класса символов. REG_EEND Потенциальная ошибка. Не определена в POSIX.2. REG_EESCAPE Конечная обратная косая черта. REG_EPAREN Непарные круглые скобки в операторах группировки. REG_ERANGE Неправильное использование оператора области: например, конец области появляется прежде её начала. REG_ESIZE Скомпилированное регулярное выражение требует буферный шаблон размером, большим 64 Кб. Это не определено в POSIX.2. REG_ESPACE Для процедур регулярных выражений закончилась память. REG_ESUBREG Неправильная обратная ссылка на подвыражение.