1. Главная страница » Компьютеры

Htuekzhyst dshf tybz c

Автор: | 16.12.2019

Квантификаторы

Аналог Пример Описание
? a? одно или ноль вхождений «а»
+ a+ одно или более вхождений «а»
* a* ноль или более вхождений «а»

Модификаторы

Символ «минус» (-) меред модификатором (за исключением U) создаёт его отрицание.

Описание
g глобальный поиск (обрабатываются все совпадения с шаблоном поиска)
i игнорировать регистр
m многострочный поиск. Поясню: по умолчанию текст это одна строка, с модификатором есть отдельные строки, а значит ^ — начало строки в тексте, $ — конец строки в тексте.
s текст воспринимается как одна строка, спец символ «точка» (.) будет вкючать и перевод строки
u используется кодировка UTF-8
U инвертировать жадность
x игнорировать все неэкранированные пробельные и перечисленные в классе символы

Спецсимволы

Аналог Описание
() подмаска, вложенное выражение
[] групповой символ
количество вхождений от «a» до «b»
| логическое «или», в случае с односимвольными альтернативами используйте []
экранирование спец символа
. любой сивол, кроме перевода строки
d [0-9] десятичная цифра
D [^d] любой символ, кроме десятичной цифры
f конец (разрыв) страницы
перевод строки
pL буква в кодировке UTF-8 при использовании модификатора u
возврат каретки
s [ v
f]
пробельный символ
S [^s] любой символ, кроме промельного
табуляция
w [0-9a-z_] любая цифра, буква или знак подчеркивания
W [^w] любой символ, кроме цифры, буквы или знака подчеркивания
v вертикальная табуляция
Читайте также:  Nvidia geforce gt630 2gb

Спецсимволы внутри символьного класса

Пример Описание
^ [^da] отрицание, любой символ кроме «d» или «a»
[a-z] интервал, любой симво от «a» до «z»

Позиция внутри строки

Пример Соответствие Описание
^ ^a aaa aaa начало строки
$ a$ aaa aaa конец строки
A Aa aaa aaa
aaa aaa
начало текста
z az aaa aaa
aaa aaa
конец текста
 a
a
aaa aaa
aaa aaa
граница слова, утверждение: предыдущий символ словесный, а следующий — нет, либо наоборот
B BaB aaa aaa отсутствие границы слова
G Ga aaa aaa Предыдущий успешный поиск, поиск остановился на 4-й позиции — там, где не нашлось a

Скачать в PDF, PNG.

Якоря

Якоря в регулярных выражениях указывают на начало или конец чего-либо. Например, строки или слова. Они представлены определенными символами. К примеру, шаблон, соответствующий строке, начинающейся с цифры, должен иметь следующий вид:

Здесь символ ^ обозначает начало строки. Без него шаблон соответствовал бы любой строке, содержащей цифру.

Символьные классы

Символьные классы в регулярных выражениях соответствуют сразу некоторому набору символов. Например, d соответствует любой цифре от 0 до 9 включительно, w соответствует буквам и цифрам, а W — всем символам, кроме букв и цифр. Шаблон, идентифицирующий буквы, цифры и пробел, выглядит так:

POSIX

POSIX — это относительно новое дополнение семейства регулярных выражений. Идея, как и в случае с символьными классами, заключается в использовании сокращений, представляющих некоторую группу символов.

Утверждения

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

Приведенный выше код начинается с поиска любых символов, кроме пробела ( [^s]* ), за которыми следует q . Затем парсер достигает «смотрящего вперед» утверждения. Это автоматически делает предшествующий элемент (символ, группу или символьный класс) условным — он будет соответствовать шаблону, только если утверждение верно. В нашем случае, утверждение является отрицательным ( ?! ), т. е. оно будет верным, если то, что в нем ищется, не будет найдено.

Читайте также:  Kremlin ru написать письмо президенту личный кабинет

Итак, парсер проверяет несколько следующих символов по предложенному шаблону ( werty ). Если они найдены, то утверждение ложно, а значит символ q будет «проигнорирован», т. е. не будет соответствовать шаблону. Если же werty не найдено, то утверждение верно, и с q все в порядке. Затем продолжается поиск любых символов, кроме пробела ( [^s]* ).

Кванторы

Кванторы позволяют определить часть шаблона, которая должна повторяться несколько раз подряд. Например, если вы хотите выяснить, содержит ли документ строку из от 10 до 20 (включительно) букв «a», то можно использовать этот шаблон:

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

Этот шаблон соответствует тексту, заключенному в двойные кавычки. Однако, ваша исходная строка может быть вроде этой:

Приведенный выше шаблон найдет в этой строке вот такую подстроку:

Он оказался слишком жадным, захватив наибольший кусок текста, который смог.

Этот шаблон также соответствует любым символам, заключенным в двойные кавычки. Но ленивая версия (обратите внимание на модификатор ? ) ищет наименьшее из возможных вхождений, и поэтому найдет каждую подстроку в двойных кавычках по отдельности:

Экранирование в регулярных выражениях

Регулярные выражения используют некоторые символы для обозначения различных частей шаблона. Однако, возникает проблема, если вам нужно найти один из таких символов в строке, как обычный символ. Точка, к примеру, в регулярном выражении обозначает «любой символ, кроме переноса строки». Если вам нужно найти точку в строке, вы не можете просто использовать « . » в качестве шаблона — это приведет к нахождению практически всего. Итак, вам необходимо сообщить парсеру, что эта точка должна считаться обычной точкой, а не «любым символом». Это делается с помощью знака экранирования.

Знак экранирования, предшествующий символу вроде точки, заставляет парсер игнорировать его функцию и считать обычным символом. Есть несколько символов, требующих такого экранирования в большинстве шаблонов и языков. Вы можете найти их в правом нижнем углу шпаргалки («Мета-символы»).

Шаблон для нахождения точки таков:

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

Спецсимволы экранирования в регулярных выражениях

Выражение Соответствие
не соответствует ничему, только экранирует следующий за ним символ. Это нужно, если вы хотите ввести метасимволы !$()*+.<>?[]^ <|>в качестве их буквальных значений.
Q не соответствует ничему, только экранирует все символы вплоть до E
E не соответствует ничему, только прекращает экранирование, начатое Q

Подстановка строк

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

Группы и диапазоны

Группы и диапазоны очень-очень полезны. Вероятно, проще будет начать с диапазонов. Они позволяют указать набор подходящих символов. Например, чтобы проверить, содержит ли строка шестнадцатеричные цифры (от 0 до 9 и от A до F), следует использовать такой диапазон:

Чтобы проверить обратное, используйте отрицательный диапазон, который в нашем случае подходит под любой символ, кроме цифр от 0 до 9 и букв от A до F:

Группы наиболее часто применяются, когда в шаблоне необходимо условие «или»; когда нужно сослаться на часть шаблона из другой его части; а также при подстановке строк.

Использовать «или» очень просто: следующий шаблон ищет «ab» или «bc»:

Если в регулярном выражении необходимо сослаться на какую-то из предшествующих групп, следует использовать
, где вместо n подставить номер нужной группы. Вам может понадобиться шаблон, соответствующий буквам «aaa» или «bbb», за которыми следует число, а затем те же три буквы. Такой шаблон реализуется с помощью групп:

Первая часть шаблона ищет «aaa» или «bbb», объединяя найденные буквы в группу. За этим следует поиск одной или более цифр ( [0-9]+ ), и наконец 1 . Последняя часть шаблона ссылается на первую группу и ищет то же самое. Она ищет совпадение с текстом, уже найденным первой частью шаблона, а не соответствующее ему. Таким образом, «aaa123bbb» не будет удовлетворять вышеприведенному шаблону, так как 1 будет искать «aaa» после числа.

Одним из наиболее полезных инструментов в регулярных выражениях является подстановка строк. При замене текста можно сослаться на найденную группу, используя $n . Скажем, вы хотите выделить в тексте все слова «wish» жирным начертанием. Для этого вам следует использовать функцию замены по регулярному выражению, которая может выглядеть так:

Первым параметром будет примерно такой шаблон (возможно вам понадобятся несколько дополнительных символов для этой конкретной функции):

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

Ею будет заменена вся найденная по шаблону строка. Мы начинаем замену с первого найденного символа (который не буква и не цифра), отмечая его $1 . Без этого мы бы просто удалили этот символ из текста. То же касается конца подстановки ( $3 ). В середину мы добавили HTML тег для жирного начертания (разумеется, вместо него вы можете использовать CSS или ), выделив им вторую группу, найденную по шаблону ( $2 ).

Модификаторы шаблонов

Модификаторы шаблонов используются в нескольких языках, в частности, в Perl. Они позволяют изменить работу парсера. Например, модификатор i заставляет парсер игнорировать регистры.

Регулярные выражения в Perl обрамляются одним и тем же символом в начале и в конце. Это может быть любой символ (чаще используется «/»), и выглядит все таким образом:

Модификаторы добавляются в конец этой строки, вот так:

Мета-символы

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

Шпаргалка представляет собой общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Она представлена в виде таблицы, помещающейся на одном печатном листе формата A4. Создана под лицензией Creative Commons на базе шпаргалки, автором которой является Dave Child. Скачать в PDF, PNG.

Классы StringBuilder и String предоставляют достаточную функциональность для работы со строками. Однако .NET предлагает еще один мощный инструмент — регулярные выражения. Регулярные выражения представляют эффективный и гибкий метод по обработке больших текстов, позволяя в то же время существенно уменьшить объемы кода по сравнению с использованием стандартных операций со строками.

Основная функциональность регулярных выражений в .NET сосредоточена в пространстве имен System.Text.RegularExpressions . А центральным классом при работе с регулярными выражениями является класс Regex. Например, у нас есть некоторый текст и нам надо найти в нем все словоформы какого-нибудь слова. С классом Regex это сделать очень просто:

Здесь мы находим в искомой строке все словоформы слова "туп". В конструктор объекта Regex передается регулярное выражение для поиска. Далее мы разберем некоторые элементы синтаксиса регулярных выражений, а пока достаточно знать, что выражение туп(w*) обозначает, найти все слова, которые имеют корень "туп" и после которого может стоять различное количество символов. Выражение w означает алфавитно-цифровой символ, а звездочка после выражения указывает на неопределенное их количество — их может быть один, два, три или вообще не быть.

Метод Matches класса Regex принимает строку, к которой надо применить регулярные выражения, и возвращает коллекцию найденных совпадений.

Каждый элемент такой коллекции представляет объект Match . Его свойство Value возвращает найденное совпадение.

Параметр RegexOptions

Класс Regex имеет ряд конструкторов, позволяющих выполнить начальную инициализацию объекта. Две версии конструкторов в качестве одного из параметров принимают перечисление RegexOptions . Некоторые из значений, принимаемых данным перечислением:

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

CultureInvariant : при установке этого значения будут игнорироваться региональные различия

IgnoreCase : при установке этого значения будет игнорироваться регистр

IgnorePatternWhitespace : удаляет из строки пробелы и разрешает комментарии, начинающиеся со знака #

Multiline : указывает, что текст надо рассматривать в многострочном режиме. При таком режиме символы "^" и "$" совпадают, соответственно, с началом и концом любой строки, а не с началом и концом всего текста

RightToLeft : приписывает читать строку справа налево

Singleline : устанавливает однострочный режим, а весь текст рассматривается как одна строка

При необходимости можно установить несколько параметров:

Синтаксис регулярных выражений

Рассмотрим вкратце некоторые элементы синтаксиса регулярных выражений:

^ : соответствие должно начинаться в начале строки (например, выражение @"^прw*" соответствует слову "привет" в строке "привет мир")

$ : конец строки (например, выражение @"w*ир$" соответствует слову "мир" в строке "привет мир", так как часть "ир" находится в самом конце)

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

* : предыдущий символ повторяется 0 и более раз

+ : предыдущий символ повторяется 1 и более раз

? : предыдущий символ повторяется 0 или 1 раз

s : соответствует любому пробельному символу

S : соответствует любому символу, не являющемуся пробелом

w : соответствует любому алфавитно-цифровому символу

W : соответствует любому не алфавитно-цифровому символу

d : соответствует любой десятичной цифре

D : соответствует любому символу, не являющемуся десятичной цифрой

Это только небольшая часть элементов. Более подробное описание синтаксиса регулярных выражений можно найти на msdn в статье Элементы языка регулярных выражений — краткий справочник.

Теперь посмотрим на некоторые примеры использования. Возьмем первый пример с скороговоркой "Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа" и найдем в ней все слова, где встречается корень "губ":

Так как выражение w* соответствует любой последовательности алфавитно-цифровых символов любой длины, то данное выражение найдет все слова, содержащие корень "губ".

Второй простенький пример — нахождение телефонного номера в формате 111-111-1111:

Если мы точно знаем, сколько определенных символов должно быть, то мы можем явным образом указать их количество в фигурных скобках: d <3>- то есть в данном случае три цифры.

Мы можем не только задать поиск по определенным типам символов — пробелы, цифры, но и задать конкретные символы, которые должны входить в регулярное выражение. Например, перепишем пример с номером телефона и явно укажем, какие символы там должны быть:

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

Также можно задать диапазон для алфавитных символов: Regex regex = new Regex("[a-v]<5>"); — данное выражение будет соответствовать любому сочетанию пяти символов, в котором все символы находятся в диапазоне от a до v.

Можно также указать отдельные значения: Regex regex = new Regex(@"[2]*-[0-9]<3>-d<4>"); . Это выражение будет соответствовать, например, такому номеру телефона "222-222-2222" (так как первые числа двойки)

С помощью операции | можно задать альтернативные символы: Regex regex = new Regex(@"[2|3]<3>-[0-9]<3>-d<4>"); . То есть первые три цифры могут содержать только двойки или тройки. Такой шаблон будет соответствовать, например, строкам "222-222-2222" и "323-435-2318". А вот строка "235-435-2318" уже не подпадает под шаблон, так как одной из трех первых цифр является цифра 5.

Итак, у нас такие символы, как *, + и ряд других используются в качестве специальных символов. И возникает вопрос, а что делать, если у нам надо найти, строки, где содержится точка, звездочка или какой-то другой специальный символ? В этом случае нам надо просто экранировать эти символы слешем:

Проверка на соответствие строки формату

Нередко возникает задача проверить корректность данных, введенных пользователем. Это может быть проверка электронного адреса, номера телефона, Класс Regex предоставляет статический метод IsMatch , который позволяет проверить входную строку с шаблоном на соответствие:

Переменная pattern задает регулярное выражение для проверки адреса электронной почты. Данное выражение предлагает нам Microsoft на страницах msdn.

Для проверки соответствия строки шаблону используется метод IsMatch: Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase) . Последний параметр указывает, что регистр можно игнорировать. И если введенная строка соответствует шаблону, то метод возвращает true .

Замена и метод Replace

Класс Regex имеет метод Replace, который позволяет заменить строку, соответствующую регулярному выражению, другой строкой:

Данная версия метода Replace принимает два параметра: строку с текстом, где надо выполнить замену, и сама строка замены. Так как в качестве шаблона выбрано выражение "s+ (то есть наличие одного и более пробелов), метод Replace проходит по всему тексту и заменяет несколько подряд идущих пробелов ординарными.

Регулярные выражения предоставляют мощный, гибкий и эффективный способ обработки текста. Regular expressions provide a powerful, flexible, and efficient method for processing text. Комплексная нотация сопоставления шаблонов регулярных выражений позволяет быстро анализировать большие объемы текста для поиска определенных шаблонов символов, проверять текст на соответствие предопределенному шаблону (например, адресу электронной почты), извлекать, изменять, заменять и удалять текстовые подстроки, а также добавлять извлеченные строки в коллекцию для создания отчета. The extensive pattern-matching notation of regular expressions enables you to quickly parse large amounts of text to find specific character patterns; to validate text to ensure that it matches a predefined pattern (such as an email address); to extract, edit, replace, or delete text substrings; and to add the extracted strings to a collection in order to generate a report. Для многих приложений, которые работают со строками или анализируют большие блоки текста, регулярные выражения — незаменимый инструмент. For many applications that deal with strings or that parse large blocks of text, regular expressions are an indispensable tool.

Принцип работы регулярных выражений How Regular Expressions Work

Главный компонент обработки текста с помощью регулярных выражений — это механизм регулярных выражений, представленный в .NET объектом System.Text.RegularExpressions.Regex. The centerpiece of text processing with regular expressions is the regular expression engine, which is represented by the System.Text.RegularExpressions.Regex object in .NET. Как минимум, для обработки текста с использованием в регулярных выражений механизму регулярных выражений необходимо предоставить два следующих элемента: At a minimum, processing text using regular expressions requires that the regular expression engine be provided with the following two items of information:

Шаблон регулярного выражения для определения текста. The regular expression pattern to identify in the text.

В .NET шаблоны регулярных выражений определяются специальным синтаксисом или языком, который совместим с регулярными выражениями Perl 5 и добавляет дополнительные возможности, например сопоставление справа налево. In .NET, regular expression patterns are defined by a special syntax or language, which is compatible with Perl 5 regular expressions and adds some additional features such as right-to-left matching. Дополнительные сведения см. в разделе Элементы языка регулярных выражений. Краткий справочник. For more information, see Regular Expression Language — Quick Reference.

Текст, который будет проанализирован на соответствие шаблону регулярного выражения. The text to parse for the regular expression pattern.

Методы класса Regex позволяют выполнять следующие операции: The methods of the Regex class let you perform the following operations:

Определить, входит ли шаблон регулярного выражения во входной текст, с помощью метода Regex.IsMatch. Determine whether the regular expression pattern occurs in the input text by calling the Regex.IsMatch method. Пример использования метода IsMatch для проверки текста см. в разделе Руководство. Проверка строк на соответствие формату электронной почты. For an example that uses the IsMatch method for validating text, see How to: Verify that Strings Are in Valid Email Format.

Получить один или все экземпляры текста, соответствующего шаблону регулярного выражения с помощью метода Regex.Match или Regex.Matches. Retrieve one or all occurrences of text that matches the regular expression pattern by calling the Regex.Match or Regex.Matches method. Первый метод возвращает объект System.Text.RegularExpressions.Match, который предоставляет сведения о соответствующем тексте. The former method returns a System.Text.RegularExpressions.Match object that provides information about the matching text. Второй метод возвращает объект MatchCollection, содержащий один объект System.Text.RegularExpressions.Match для каждого соответствия, обнаруженного в обработанном тексте. The latter returns a MatchCollection object that contains one System.Text.RegularExpressions.Match object for each match found in the parsed text.

Заменить текст, соответствующий шаблону регулярного выражения, с помощью метода Regex.Replace. Replace text that matches the regular expression pattern by calling the Regex.Replace method. Примеры использования метода Replace для изменения форматов даты и удаления недопустимых символов из строки см. в разделах Руководство. Исключение недопустимых символов из строки и Руководство. Изменение форматов даты. For examples that use the Replace method to change date formats and remove invalid characters from a string, see How to: Strip Invalid Characters from a String and Example: Changing Date Formats.

Обзор объектной модели регулярных выражений см. в разделе Объектная модель регулярных выражений. For an overview of the regular expression object model, see The Regular Expression Object Model.

Дополнительные сведения о языке регулярных выражений см. в кратком справочнике по элементам языка регулярных выражений или в одной из следующих брошюр, который вы можете скачать и распечатать: For more information about the regular expression language, see Regular Expression Language — Quick Reference or download and print one of these brochures:

Примеры регулярных выражений Regular Expression Examples

Класс String содержит ряд методов для поиска и замены строк, которые можно использовать для поиска строковых литералов в длинных строках. The String class includes a number of string search and replacement methods that you can use when you want to locate literal strings in a larger string. Регулярные выражения максимально полезны, если требуется найти одну из нескольких подстрок в длинной строке или определить шаблоны в строке, как показано в следующих примерах. Regular expressions are most useful either when you want to locate one of several substrings in a larger string, or when you want to identify patterns in a string, as the following examples illustrate.

Пример 1: Замена подстрок Example 1: Replacing Substrings

Предположим, что список рассылки содержит имена, в которые иногда входит обращение (Mr., Mrs., Miss или Ms.) в дополнение к имени и фамилии. Assume that a mailing list contains names that sometimes include a title (Mr., Mrs., Miss, or Ms.) along with a first and last name. Если вы не хотите включать обращения при создании этикеток для конвертов из списка, с помощью регулярного выражения их можно удалить, как показано в следующем примере. If you do not want to include the titles when you generate envelope labels from the list, you can use a regular expression to remove the titles, as the following example illustrates.

Шаблон регулярного выражения (Mr.? |Mrs.? |Miss |Ms.? ) сопоставляет все вхождения строк "Mr", "Mr.", "Mrs", "Mrs.", "Miss", "Ms" или "Ms.". The regular expression pattern (Mr.? |Mrs.? |Miss |Ms.? ) matches any occurrence of "Mr ", "Mr. ", "Mrs ", "Mrs. ", "Miss ", "Ms or "Ms. ". После вызова метода Regex.Replace сопоставленная строка заменяется на String.Empty; другими словами, она удаляется из исходной строки. The call to the Regex.Replace method replaces the matched string with String.Empty; in other words, it removes it from the original string.

Пример 2: Поиск повторяющихся слов Example 2: Identifying Duplicated Words

Случайный повтор слов — это распространенная ошибка при написании текстов. Accidentally duplicating words is a common error that writers make. Регулярное выражение можно использовать для определения повторяющихся слов, как показано в следующем примере. A regular expression can be used to identify duplicated words, as the following example shows.

Шаблон регулярного выражения (w+?)s1 интерпретируется следующим образом: The regular expression pattern (w+?)s1 can be interpreted as follows:

 Начало на границе слова. Start at a word boundary.
(w+?) (w+?) Соответствует одному или нескольким символам слова (как можно меньшему количеству). Match one or more word characters, but as few characters as possible. Вместе они формируют группу, к которой можно обращаться как к 1 . Together, they form a group that can be referred to as 1 .
s Соответствует пробелу. Match a white-space character.
1 Сопоставление подстроки, равной группе с именем 1 . Match the substring that is equal to the group named 1 .
 Соответствует границе слова. Match a word boundary.

Метод Regex.Matches вызывается с параметрами регулярного выражения RegexOptions.IgnoreCase. The Regex.Matches method is called with regular expression options set to RegexOptions.IgnoreCase. Поэтому операция сопоставления учитывает регистр, а пример указывает, что подстрока "This this" является повтором. Therefore, the match operation is case-insensitive, and the example identifies the substring "This this" as a duplication.

Обратите внимание, что входная строка содержит подстроку "this? Note that the input string includes the substring "this? This". This". Но из-за знака пунктуации она не считается повторением. However, because of the intervening punctuation mark, it is not identified as a duplication.

Пример 3. Динамическое создание регулярного выражения с учетом языка и региональных параметров Example 3: Dynamically Building a Culture-Sensitive Regular Expression

Следующий пример демонстрирует преимущества использования регулярных выражений с гибкими возможностями глобализации .NET. The following example illustrates the power of regular expressions combined with the flexibility offered by .NET’s globalization features. В примере объект NumberFormatInfo применяется для определения формата денежных значений в текущих региональных стандартах системы. It uses the NumberFormatInfo object to determine the format of currency values in the system’s current culture. Затем эти данные используются для динамического создания регулярного выражения, которое извлекает денежные значения из текста. It then uses that information to dynamically construct a regular expression that extracts currency values from the text. Для каждого совпадения извлекается подгруппа, содержащая только числовые строки, которая преобразуется в значение Decimal, после чего рассчитывается промежуточный итог. For each match, it extracts the subgroup that contains the numeric string only, converts it to a Decimal value, and calculates a running total.

На компьютере с региональными параметрами "English — United States (en-US)" пример динамически создает регулярное выражение $s*[-+]?([0-9]<0,3>(,[0-9]<3>)*(.[0-9]+)?) . On a computer whose current culture is English — United States (en-US), the example dynamically builds the regular expression $s*[-+]?([0-9]<0,3>(,[0-9]<3>)*(.[0-9]+)?) . Шаблон регулярного выражения интерпретируется следующим образом: This regular expression pattern can be interpreted as follows:

$ Выполняется поиск одного вхождения символа доллара ( $ ) во входной строке. Look for a single occurrence of the dollar symbol ( $ ) in the input string. Строка шаблона регулярного выражения содержит обратную косую черту, что говорит о том, что символ доллара интерпретируется буквально, а не как привязка регулярного выражения. The regular expression pattern string includes a backslash to indicate that the dollar symbol is to be interpreted literally rather than as a regular expression anchor. (Отдельный символ $ указывает, что механизм регулярных выражений должен начинать сопоставление с конца строки.) Чтобы правильно обработать текущий символ валюты, в примере вызывается метод Regex.Escape, который экранирует символ. (The $ symbol alone would indicate that the regular expression engine should try to begin its match at the end of a string.) To ensure that the current culture’s currency symbol is not misinterpreted as a regular expression symbol, the example calls the Regex.Escape method to escape the character.
s* Поиск нуля или нескольких вхождений пробела. Look for zero or more occurrences of a white-space character.
[-+]? Поиск нуля или нескольких вхождений знака плюс или минус. Look for zero or one occurrence of either a positive sign or a negative sign.
([0-9]<0,3>(,[0-9]<3>)*(.[0-9]+)?) Внешние круглые скобки вокруг этого выражения делают его захватываемой группой или частью выражения. The outer parentheses around this expression define it as a capturing group or a subexpression. Если найдено соответствие, сведения об этой части строки можно получить из второго объекта Group в объекте GroupCollection, который возвращается свойством Match.Groups. If a match is found, information about this part of the matching string can be retrieved from the second Group object in the GroupCollection object returned by the Match.Groups property. (Первый элемент в коллекции представляет все сопоставление.) (The first element in the collection represents the entire match.)
[0-9] Поиск 0-3 вхождений десятичных цифр (0-9). Look for zero to three occurrences of the decimal digits 0 through 9.
(,[0-9]<3>)* Поиск нуля или нескольких вхождений разделителя группы, за которыми следуют три десятичные цифры. Look for zero or more occurrences of a group separator followed by three decimal digits.
. Поиск одного вхождения десятичного разделителя. Look for a single occurrence of the decimal separator.
[0-9]+ Поиск одной или нескольких десятичных цифр. Look for one or more decimal digits.
(.[0-9]+)? Поиск нуля или одного вхождения десятичного разделителя, за которым следует по крайней мере одна десятичная цифра. Look for zero or one occurrence of the decimal separator followed by at least one decimal digit.

Если каждый из этих подшаблонов найден во входной строке, сопоставление является успешным, а объект Match с информацией о сопоставлении добавляется в объект MatchCollection. If each of these subpatterns is found in the input string, the match succeeds, and a Match object that contains information about the match is added to the MatchCollection object.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *