Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Perl Regular Expression Syntax

Boost , Boost.Regex 5.1.2 , Regular Expression Syntax

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Synopsis

Синтаксис регулярных выражений Perl основан на том, что используется языком программирования Perl. Регулярные выражения Perl — это поведение по умолчанию в Boost. Regex или вы можете передать флаг<perl>конструктору<basic_regex>, например:

// e1 is a case sensitive Perl regular expression: 
// since Perl is the default option there's no need to explicitly specify the syntax used here:
boost::regex e1(my_expression);
// e2 a case insensitive Perl regular expression:
boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

Perl Regular Expression Syntax

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

.[{}()\*+?|^$
Wildcard

При использовании вне набора символов одиночный символ будет соответствовать любому отдельному символу, за исключением:

  • Символ NULL, когда флаг<match_not_dot_null>передается соответствующим алгоритмам.
  • Новый символ линии, когда флаг<match_not_dot_newline>передается алгоритмам соответствия.
Anchors

Персонаж «^» должен соответствовать началу строки.

Персонаж «$» должен соответствовать концу строки.

Marked sub-expressions

Раздел, начинающийся<(>и заканчивающийся<)>, действует как обозначенное подвыражение. Все, что соответствует подвыражению, разделено в отдельном поле алгоритмами сопоставления. Помеченные подвыражения также могут повторяться или упоминаться посредством обратной ссылки.

Non-marking grouping

Помеченное подвыражение полезно для лексически группирования части регулярного выражения, но имеет побочный эффект выделения дополнительного поля в результате. В качестве альтернативы можно лексически группировать часть регулярного выражения, не генерируя помеченное подвыражение с помощью<(?:>и<)>, например<(?:ab)+>будет повторяться<ab>без выделения каких-либо отдельных подвыражений.

Repeats

Любой атом (единый символ, обозначенное подвыражение или класс символов) может быть повторен с операторами<*>,<+>,<?>и<{}>.

Оператор<*>будет соответствовать предыдущему нулю атома или более раз, например выражение<a*b>будет соответствовать любому из следующего:

b
ab
aaaaaaaab

Оператор<+>будет соответствовать предыдущему атому один или более раз, например, выражение<a+b>будет соответствовать любому из следующего:

ab
aaaaaaaab

Но не будет соответствовать:

b

Оператор<?>будет соответствовать предыдущему нулю атома или один раз, например, выражение ca?b будет соответствовать любому из следующего:

cb
cab

Но не будет соответствовать:

caab

Атом также может быть повторен с ограниченным повторением:

<a{n}>Матчи «а» повторяются ровно n раз.

<a{n,}>Матчи «а» повторяются n или более раз.

<a{n, m}>Матчи 'a' повторяются между n и m раз включительно.

Например:

^a{2,3}$

Будет соответствовать любому из:

aa
aaa

Но ни один из них:

a
aaaa

Обратите внимание, что символы «{» и «}» будут рассматриваться как обычные буквы при использовании в контексте, который не является повторением: это соответствует поведению Perl 5.x. Например, в выражениях "ab{1", "ab1}" и "a{b}c" кудрявые скобки рассматриваются как буквальные, иникакой ошибки не будет поднято.

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

a(*)

Это приведет к возникновению ошибки, поскольку оператор<*>не будет применяться.

Non greedy repeats

Обычные операторы повторов «жадны», то есть они будут потреблять как можно больше ресурсов. Доступны нежадные версии, которые будут потреблять как можно меньше входных данных, все еще создавая совпадение.

<*?>Соответствует предыдущему нулю атома или более раз, потребляя при этом как можно меньше входных данных.

<+?>Соответствует предыдущему атому один или несколько раз, потребляя при этом как можно меньше входных данных.

<??>Соответствует предыдущему атому ноль или один раз, потребляя при этом как можно меньше входных данных.

<{n,}?>Соответствует предыдущему атому n или более раз, потребляя при этом как можно меньше входных данных.

<{n,m}?>Соответствует предыдущему атому от n до m раз, потребляя при этом как можно меньше входных данных.

Possessive repeats

По умолчанию, когда повторяющийся шаблон не совпадает, двигатель будет отступать, пока не будет найден матч. Однако такое поведение иногда может быть нежелательным, поэтому есть также «одержимые» повторы: они соответствуют как можно больше и не позволяют отступать, если остальная часть выражения не соответствует.

<*+>Соответствует предыдущему нулю атома или более раз, ничего не возвращая.

<++>Соответствует предыдущему атому один или несколько раз, ничего не отдавая.

<?+>Соответствует предыдущему атому ноль или один раз, при этом ничего не возвращая.

<{n,}+>Соответствует предыдущему атому n или более раз, ничего не возвращая.

<{n,m}+>Соответствует предыдущему атому от n до m раз, ничего не отдавая.

Back references

Характер побега, за которым следует цифраn, гдеnнаходится в диапазоне 1-9, соответствует той же строке, которая была сопоставлена субэкспрессиейn. Например, выражение:

^(a*).*\1$

Будет соответствовать струне:

aaabbaaa

Но только не струна:

aaabba

Вы также можете использовать выход \g для той же функции, например:

Побег

значение

<\g1>

Сопоставьте все, что соответствует подвыражению 1

<\g{1}>

Сопоставить все, что соответствует подвыражению 1: эта форма позволяет более безопасно анализировать выражение в таких случаях, как<\g{1}2>или для индексов выше 9, как в<\g{1234}>

.

<\g-1>

Матч, соответствующий последней открытой подэкспрессии

<\g{-2}>

Матч, соответствующий последнему, но открытому суб-выражению

<\g{one}>

Матч, соответствующий подвыражению «один»

Наконец, выход \k может быть использован для обозначения названных подвыражений, например<\k<two>>будет соответствовать тому, что соответствует подвыражению, названному «два».

Alternation

Оператор<|>будет соответствовать любому из его аргументов, поэтому, например:<abc|def>будет соответствовать либо «abc», либо «def».

Парентезис можно использовать для групповых чередований, например:<ab(d|ef)>будет соответствовать либо «abd», либо «abef».

Пустые альтернативы не допускаются (это почти всегда ошибка), но если вы действительно хотите использовать пустую альтернативу<(?:)>в качестве заполнителя, например:

<|abc>не является действительным выражением, но

<(?:)|abc>является и является эквивалентом выражения:

<(?:abc)??>имеет тот же эффект.

Character sets

Набор символов - это выражение скобки, начинающееся с<[] and ending with>, оно определяет набор символов и соответствует любому отдельному персонажу, который является членом этого набора.

Выражение скобки может содержать любую комбинацию из следующего:

Single characters

Например,<[abc]>, будет соответствовать любому из символов 'a', 'b' или 'c'.

Character ranges

Например,<[a-c]>будет соответствовать любому одному персонажу в диапазоне от «a» до «c». По умолчанию для регулярных выражений Perl символ x находится в диапазоне от y до z, если кодовая точка символа находится в кодовых точках конечных точек диапазона. В качестве альтернативы, если вы устанавливаете флаг<collate>при построении регулярного выражения, диапазоны чувствительны к локализации.

Negation

Если выражение скобки начинается с символа ^, то оно совпадает с дополнением символов, которые оно содержит, например<[^a-c]>соответствует любому персонажу, который не находится в диапазоне<a-c>.

Character classes

Выражение формы<[[:name:]]>соответствует названному классу символов «имя», например<[[:lower:]]>соответствует любому персонажу нижнего регистра. См.названия классов символов.

Collating Elements

Выражение формы<[[.col.]]>соответствует коллационному элементуcol. Коллатинговый элемент — это любой одиночный символ или любая последовательность символов, которые коллатируются как единое целое. В качестве конечной точки диапазона могут также использоваться элементы коллатинга, например:<[[.ae.]-c]>соответствует последовательности символов «ae», плюс любой одиночный символ в диапазоне «ae»-c, предполагая, что «ae» рассматривается как один элемент коллатинга в текущей локализации.

В качестве расширения элемент коллатинга может быть также указан через егосимволическое имя, например:

[[.NUL.]]

Совпадает с персонажем<\0>.

Equivalence classes

Выражение формы<[[=col=]]>соответствует любому символу или коллатеральному элементу, основной сорт-ключ которого такой же, как и для коллатерального элементаcol, так как с коллатеральными элементами имяcolможет бытьсимволическим именем. Основной сорт-ключ - это тот, который игнорирует случай, акцентацию или локализованные пошивы; так, например,<[[=a=]]>соответствует любому из персонажей: a, & #192;, & #193;, & #194;, & #195;, & #196;, & #197;, A, & #224;, & #225;, & #226;, & #227;, & #228; и & #229;. К сожалению, реализация этого зависит от поддержки коллаборации и локализации платформы; на эту функцию нельзя полагаться для переносимости на всех платформах или даже во всех местах на одной платформе.

Escaped Characters

Все последовательности побега, которые соответствуют одному символу или одному классу символов, разрешены в определении класса символов. Например,<[\[\]]>будет соответствовать либо<[>, либо<]>, в то время как<[\W\d]>будет соответствовать любому символу, который является либо «цифрой»,илиявляется, а не«слова» символ.

Combinations

Все вышеперечисленное можно объединить в одну декларацию набора символов, например:<[[:digit:]a-c[.NUL.]]>.

Escapes

Любой особый характер, которому предшествует побег, должен соответствовать самому себе.

Следующие последовательности бегства являются синонимами для отдельных символов:

Побег

характер

<\a>

<\a>

<\a>

<0x1B>

<\a>

<\a>

<
>

<
>

<\a>

<\a>

<\t>

<\t>

<\v>

<\v>

<\b>

<\b>(но только внутри объявления класса символов).

<\cX>

Последовательность побега ASCII — символ, кодовая точка которого составляет X % 32

<\xdd>

Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdd.

<\x{dddd}>

Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdddd.

<\0ddd>

Октальная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0ddd.

<\N{name}>

Соответствует единственному символу, который имеетсимволическое имяимя. Например,<\N{newline}>соответствует единственному символу

.
"Single character" character classes:

Любой сбежавший персонажx, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, который является членом этого класса, и любой сбежавший персонажX, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, не относящемуся к этому классу.

По умолчанию поддерживаются следующие:

Последовательность побега

эквивалентный

<\d>

<[[:digit:]]>

<\l>

<[[:lower:]]>

<\s>

<[[:space:]]>

<\u>

<[[:upper:]]>

<\w>

<[[:word:]]>

<\h>

Горизонтальное белое пространство

<\v>

Вертикальное белое пространство

<\D>

<[^[:digit:]]>

<\L>

<[^[:lower:]]>

<\S>

<[^[:space:]]>

<\U>

<[^[:upper:]]>

<\W>

<[^[:word:]]>

<\H>

Не горизонтальное белое пространство

<\V>

Не вертикальное белое пространство

Character Properties

Имена свойств символов в следующей таблице эквивалентны именам, используемым в классах символов.

форма

Описание

эквивалентная форма набора символов

<\pX>

Соответствует любому символу, который имеет свойство X.

<[[:X:]]>

<\p{Name}>

Соответствует любому символу, имеющему имя свойства.

<[[:Name:]]>

<\PX>

Соответствует любому символу, который не обладает свойством X.

<[^[:X:]]>

<\P{Name}>

Соответствует любому символу, который не имеет имени собственности.

<[^[:Name:]]>

Например,<\pd>соответствует любому «цифровому» персонажу, как и<\p{digit}>.

Word Boundaries

Следующие последовательности побега соответствуют границам слов:

<<>Соответствует началу слова.

<>>Соответствует концу слова.

<\b>Соответствует границе слова (начало или конец слова).

<\B>Соответствует только тогда, когда не на границе слова.

Buffer boundaries

Следующее совпадение только на границах буфера: «буфер» в этом контексте - это весь входной текст, который сопоставляется с (обратите внимание, что ^ и $ могут соответствовать встроенным новым линиям в тексте).

\' Матчи только в начале буфера.

Матчи только в конце буфера.

Матчи только в начале буфера (то же самое, что<\`>).

\z Совпадения только в конце буфера (то же самое, что<\'>).

Z соответствует утверждению нулевой ширины, состоящему из необязательной последовательности новых линий в конце буфера: эквивалентно обычному выражению<(?=\v*\z)>. Обратите внимание, что это тонко отличается от Perl, который ведет себя как подобие<(?=\n?\z)>.

Continuation Escape

Последовательность<\G>совпадает только в конце последнего найденного матча или в начале текста, если предыдущий матч не был найден. Этот выход полезен, если вы повторяете матчи, содержащиеся в тексте, и хотите, чтобы каждый последующий матч начинался там, где закончился последний.

Quoting escape

Последовательность выхода<\Q>начинается с «цитируемой последовательности»: все последующие символы рассматриваются как буквальные, пока не будет найден конец регулярного выражения или \E. Например, выражение:<\Q*+\Ea+>соответствует любому из:

\*+a
\*+aaa
Unicode escapes

<\C>Соответствует одной точке кода: в Boost regex это имеет точно такой же эффект, как и оператор.<\X>Соответствует комбинирующей последовательности символов: то есть любой некомбинирующий символ, за которым следует последовательность нулевых или более комбинирующих символов.

Matching Line Endings

Последовательность выхода<\R>совпадает с любой последовательностью окончания строки символа, в частности, она идентична выражению<(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])>.

Keeping back some text

<\K>Сбрасывает начальное местоположение $0 в текущую текстовую позицию: другими словами, все слева от \K «сохранено» и не является частью соответствия обычного выражения. $ обновляется соответствующим образом.

Например,<foo\Kbar>, сопоставленный с текстом «foobar», вернул бы матч «bar» за $0 и «foo» за $’. Это может быть использовано для имитации утверждений с переменной шириной.

Any other escape

Любая другая последовательность побега соответствует персонажу, который ускользнул, например, @ соответствует буквальному @.

Perl Extended Patterns

Перл-специфические расширения синтаксиса регулярных выражений начинаются с<(?>.

Named Subexpressions

Вы можете создать именованное подвыражение, используя:

(?<NAME>expression)

Назвать его можно по имениИмя. В качестве альтернативы вы можете разграничить имя, используя «Имя», как в:

(?'NAME'expression)

Эти названные подвыражения могут упоминаться в обратной ссылке, используя либо<\g{NAME}>, либо<\k<NAME>>, а также могут упоминаться по имени в. Perlформатирует строку для поиска и замены операций, или в<match_results>функции-члены.

Comments

<(?# ... )>рассматривается как комментарий, его содержание игнорируется.

Modifiers

<(?imsx-imsx ... )>изменяет, какие из модификаторов perl действуют в пределах рисунка, изменения вступают в силу с точки, в которой блок впервые виден, и распространяются на любую оболочку<)>. Письма перед '-' включите этот модификатор perl, письма после этого выключите его.

<(?imsx-imsx:pattern)>применяет указанные модификаторы только к шаблону.

Non-marking groups

<(?:pattern)>Лексически групповой паттерн, не порождающий дополнительной субэкспрессии.

Branch reset

<(?|pattern)>сбрасывает подэкспрессионное число в начале каждой альтернативы « |» вшаблоне.

Подэкспрессионное число, следующее за этой конструкцией, — это количество ветвей, имеющих наибольшее количество подэкспрессий. Эта конструкция полезна, когда вы хотите захватить одно из нескольких альтернативных совпадений в одном подэкспрессионном индексе.

В следующем примере индекс каждого подвыражения показан ниже выражения:

# before  ---------------branch-reset----------- after
/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
# 1            2         2  3        2     3     4
Lookahead

<(?=pattern)>потребляет ноль символов, только если шаблон совпадает.

<(?!pattern)>потребляет ноль символов, только если шаблон не совпадает.

Lookahead обычно используется для создания логических и двух регулярных выражений, например, если пароль должен содержать букву нижнего регистра, букву верхнего регистра, символ пунктуации и иметь длину не менее 6 символов, то выражение:

(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}

Можно использовать для проверки пароля.

Lookbehind

<(?<=pattern)>потребляет ноль символов, только если шаблон может быть сопоставлен с символами, предшествующими текущему положению (паттерн должен быть фиксированной длины).

<(?<!pattern)>потребляет ноль символов, только если шаблон не может быть сопоставлен с символами, предшествующими текущему положению (паттерн должен быть фиксированной длины).

Independent sub-expressions

<(?>pattern)>соответствует независимо от окружающих паттернов, выражение никогда не вернется к. Независимые суб-выражения обычно используются для повышения производительности; будет рассмотрено только наилучшее возможное соответствие для шаблона, если это не позволяет выражению в целом соответствовать, то совпадение не найдено вообще.

Recursive Expressions

<(?N) (?-N) (?+N) (?R) (?0) (?&NAME)>

<(?R)>и<(?0)>возвращаются к началу всей картины.

<(?N)>выполняет подвыражениеNрекурсивно, например<(?2)>будет повторяться до подвыражения 2.

<(?-N)>и<(?+N)>являются относительными рекурсиями, поэтому, например,<(?-1)>повторяется до последнего подвыражения, которое будет объявлено, и<(?+1)>повторяется до следующего подвыражения, которое будет объявлено.

<(?&NAME)>повторяется в названном суб-выраженииИмя.

Conditional Expressions

<(?(condition)yes-pattern|no-pattern)>пытается сопоставитьда-паттерн, еслиусловиеверно, в противном случае попытки сопоставитьне-паттерн.

<(?(condition)yes-pattern)>пытается сопоставитьда-паттерн, если условиеверно, в противном случае соответствует строке NULL.

условиеможет быть либо: утверждением вперед, указателем отмеченного подвыражения (условие становится истинным, если подвыражение было сопоставлено), либо индексом рекурсии (условие становится истинным, если мы выполняем непосредственно внутри указанной рекурсии).

Вот краткое изложение возможных предикатов:

  • <(?(?=assert)yes-pattern|no-pattern)>Исполняетда-паттерн, если внешний вид вперед утверждает совпадения, в противном случае выполняетно-паттерн.
  • <(?(?!assert)yes-pattern|no-pattern)>Исполняет«да-паттерн», если утверждение «смотрящий вперед» не совпадает, в противном случае выполняет«нет-паттерн».
  • <(?(N)yes-pattern|no-pattern)>Выполняетда-паттерн, если подэкспрессияNбыла сопоставлена, в противном случае выполняетно-паттерн.
  • <(?(<name>)yes-pattern|no-pattern)>Выполняетда-паттерн, если имя подэкспрессииимябыло сопоставлено, в противном случае выполняетно-паттерн.
  • <(?('name')yes-pattern|no-pattern)>Выполняетда-паттерн, если подэкспрессияимябыла сопоставлена, в противном случае выполняетно-паттерн.
  • <(?(R)yes-pattern|no-pattern)>Исполняетда-паттерн, если мы выполняем внутри рекурсии, в противном случае выполняетно-паттерн.
  • <(?(RN)yes-pattern|no-pattern)>Исполняетда-паттерн, если мы выполняем внутри рекурсии к субэкспрессииN, в противном случае выполняетно-паттерн.
  • <(?(R&name)yes-pattern|no-pattern)>Исполняетда-паттерн, если мы выполняем внутри рекурсии к названному подвыражениюимени, в противном случае выполняетно-паттерн.
  • <(?(DEFINE)never-exectuted-pattern)>Определяет блок кода, который никогда не выполняется и не соответствует символам: он обычно используется для определения одного или нескольких названных подвыражений, которые упоминаются из других мест в шаблоне.
Backtracking Control Verbs

Эта библиотека имеет частичную поддержку глаголов Perl, в частности (*MARK) не поддерживается. Между этой библиотекой и Perl также могут быть различия в поведении, не в последнюю очередь потому, что поведение Perl довольно недокументировано и часто несколько случайно. Поддерживаются следующие глаголы:

  • <(*PRUNE)>Не имеет никакого эффекта, если не вернуться назад, и в этом случае вся информация об обратном отслеживании до этого момента отбрасывается.
  • <(*SKIP)>Ведет себя так же, как<(*PRUNE)>, за исключением того, что предполагается, что никакое совпадение не может произойти до текущей точки в поисковой строке. Это может быть использовано для оптимизации поиска, пропуская фрагменты текста, которые уже определены, не могут сформировать совпадение.
  • <(*THEN)>Не имеет никакого эффекта, если не вернуться назад, и в этом случае все последующие альтернативы в группе чередований отбрасываются.
  • <(*COMMIT)>Не имеет никакого эффекта, если не отойдет назад, и в этом случае все последующие попытки сопоставления/поиска будут прекращены.
  • <(*FAIL)>В этой точке матч выходит из строя без каких-либо условий и может быть использован для отката двигателя.
  • <(*ACCEPT)>Причин, по которым паттерн считается соответствующим в текущей точке. Любые полуоткрытые суб-выражения закрыты в текущей точке.
Operator precedence

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

  1. Связанные с коллацией символы скобки<[==] [::][..]>
  2. Сбежавшие персонажи<\>
  3. Набор символов (выражение кронштейна)<[]>
  4. Группа<()>
  5. Односимвольное дублирование ERE<* + ? {m,n}>
  6. конкатенация
  7. Анчоринг ^$
  8. Изменение

What gets matched

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

Альтернативно:

Наилучшим найденным матчем являетсялевый матч, с отдельными элементами, сопоставленными следующим образом;

строительство

Что будет соответствовать

<AtomA AtomB>

Находится лучший матч дляAtomA, который имеет следующий матч дляAtomB

.

<Expression1 | Expression2>

ЕслиЭкспрессия1может быть сопоставлена, то возвращает это соответствие, в противном случае пытается сопоставитьЭкспрессия2.

<S{N}>

МатчиSповторялись ровно N раз.

<S{N,M}>

Матчи S повторяется между временами N и M и как можно чаще.

<S{N,M}?>

Матчи S повторяется между временами N и M и как можно реже.

<S?, S*, S+>

То же, что<S{0,1}>,<S{0,UINT_MAX}>,<S{1,UINT_MAX}>соответственно.

<S??, S*?, S+?>

То же, что<S{0,1}?>,<S{0,UINT_MAX}?>,<S{1,UINT_MAX}?>соответственно.

<(?>S)>

Лучше всего подходит дляS, и только это.

<(?=S), (?<=S)>

Матчи только лучшее соответствие дляS(это видно только если есть захват скобки вS).

<(?!S), (?<!S)>

Рассматривает только то, существует ли совпадение для S или нет.

<(?(condition)yes-pattern | no-pattern)>

Если условие истинно, то рассматривается только «да-паттерн», в противном случае рассматривается только «нет-паттерн».

Variations

опции<normal>,<ECMAScript>,<JavaScript>и<JScript>являются синонимами<perl>.

Options

Существуетмножество флагов, которые могут быть объединены с<perl>опцией при построении регулярного выражения, в частности, обратите внимание, что опция<newline_alt>изменяет синтаксис, в то время как опции<collate>,<nosubs>и<icase>изменяют способ применения чувствительности корпуса и локализации.

Pattern Modifiers

Модификаторы perl<smix>могут быть применены либо с использованием префикса<(?smix-smix)>к регулярному выражению, либо с одним из флагов времени<no_mod_m>,<mod_x>,<mod_s>и<no_mod_s>.

References

Perl 5.8.


PrevUpHomeNext

Статья Perl Regular Expression Syntax раздела Boost.Regex 5.1.2 Regular Expression Syntax может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Regular Expression Syntax ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:30:56/0.01235294342041/0