Регулярні вирази в VB. Net (исходники), Різне, Програмування, статті

Введення


Регулярні вирази – це потужна технологія, призначена для роботи з рядками. Вона була створена в шістдесяті роки, задовго до появи персональних комп’ютерів. Широко застосовується в скриптових мовах програмування – Perl, Jscript, VBScript.

Ви вже знаєте, що недавно Microsoft випустила у світ платформу. NET Framework. У неї були вбудовані класи для роботи з регулярними виразами. Нижче буде коротко описані можливості регулярних виразів і принципи роботи з ними мовою Visual Basic. NET.

Що таке регулярні вирази


Якщо Ви вже знайомі з регулярними виразами, то можете сміливо пропустити цей розділ.

За допомогою регулярних виразів ви можете робити пошук, заміну підрядків, використовуючи шаблони. Вони складаються зі звичайних символів і так званих метасимволів (metacharacters) – керуючих символів. Список метасимволів достатньо обширний. Нижче наведені найбільш часто використовувані символи.




















































Символ  Опис 
* Відповідає висловом, що знаходиться до знака “*”, взятому нуль або більше разів. Наприклад, шаблон “[0-9] *” визначає рядок, що містить нуль або більше цифр.
Призначений для визначення символу, що є метасимволом. Наприклад, шаблон “.” відповідає будь-якому символу, а шаблон “.” буде відповідати точці.
^ Визначає початок вхідного рядка.
$ Визначає кінець вхідного рядка.
+ Відповідає висловом, що знаходиться до знака “+”, взятому один або більше разів. Наприклад, шаблон “[0-9] +” визначає рядок, що містить одну або більше цифр.
. Визначає будь-який символ окрім символу перекладу рядка.
/ Розділяє два вирази. Наприклад, шаблоном “a / b” будуть відповідати рядка “a” і “b”.
[a-z] Визначає діапазон символів. Наприклад, шаблон “[0-9]” визначає цифру.
[^…] Визначає будь-який символ, що не відповідає заданому набору. Наприклад, шаблон “[^ 0-9]” визначає будь-який символ, крім цифри.
w Слово. Те ж, що й [a-zA-Z_0-9].
W Все, крім слів. Те ж, що й [^ a-zA-Z_0-9].
s Будь-яке порожнє місце. Те ж, що й [f
v].
S Будь непорожнє місце. Те ж, що й [^ f
v].
d Десяткова цифра. Те ж, що й [0-9].
D Чи не цифра. Те ж, що й [^ 0-9].


Інші метасимволи ви можете знайти в MSDN. Нижче наведено простий приклад регулярного виразу – шаблон номера телефону.

^((d+)){0,1}d{3}-d{2}-d{2}$

Цей вислів може здатися складним, хоча насправді все просто. Починаємо розбір польотів …


Клас RegEx


Для роботи з регулярними виразами в VB. NET використовується клас RegEx, що знаходиться в просторі імен System.Text.RegularExpressions. За допомогою цього класу ви можете проводити наступні дії:


Нижче ці дії будуть розглянуті детальніше.

Для твору дій з регулярними виразами необхідно створити екземпляр класу RegEx. Для цього використовується стандартний конструктор New. Він перевантажений і має дві комбінації параметрів. Ви можете задати тільки шаблон (змінна типу String), який буде використовуватися в подальшому, або шаблон і параметри об’єкта. Параметри задаються константами з перерахування RegExOptions. Нижче наведені константи та інформація про них.






























Константа  Опис 
Compiled Вказує, що регулярний вираз буде скомпільовано в збірку. Детальніше про компілюють регулярних виразах читайте нижче.
ECMAScript Встановлює ECMAScript-сумісність вираження. Може використовуватися разом з константами IgnoreCase, Multiline і Compiled. При використанні ECMAScript з іншими константами буде ініційовано виняток.
IgnoreCase Визначає, що при проведенні операцій з виразами, регістр не має значення.
IgnorePatternWhitespace Усуває прогалини з шаблонів і дозволяє використовувати коментарі, відмічені знаком “#”.
Multiline Якщо цей прапор встановлений, то метасимволи “^” і “$” відзначають початок і кінець кожного рядка (рядки розділені знаком переведення рядка), а не початок і кінець усього висловлювання.
None Вказує, що не встановлена ​​жодна опція.
RightToLeft Встановлює, що пошук буде проводитися з права на ліво, а не навпаки.
SingleLine Вказує, що операції будуть проводитися в однорядковому режимі. Ця константа змінює значення метасимвола “.”. Він визначає будь-який символ, включаючи символ перекладу рядка.


Пошук підрядків, відповідних шаблоном проводиться за допомогою переобтяженого методу Matches. Він може приймати 4 комбінації параметрів. Перший параметр – рядок, в якій буде проводитися пошук. В Як другий параметра можна встановити позицію, з якої буде розпочато пошук. Також другим параметром можна вказати шаблон (якщо він не збігається з шаблоном, зазначеним в конструкторі при створенні об’єкта). І остання комбінація параметрів – рядок для пошуку, шаблон і параметри пошуку, задані комбінацією констант перерахування RegExOptions (див. таблицю 1).


Метод повертає об’єкт MatchCollection. Це колекція, яка містить об’єкти Match. Отримати об’єкт Match можна за допомогою індексованого властивості Item колекції. Нумерація елементів починається з нуля. Щоб отримати знайдену підрядок, слід використовувати властивість Value об’єкта Macth.

Нижче наведено невеликий приклад пошуку тегів в HTML коді.


Dim regexp As New Regex(“<(.*?)>”)
Dim html As String
Dim i As Integer
Dim m As MatchCollection
html = “

Це приклад пошуку
m = regexp.Matches(html)
For i = 0 To m.Count – 1
MsgBox(m.Item(i).Value)
Next



Заміна


Інше часто використовуване дію, вироблена за допомогою класу RegEx – заміна підрядків з використанням шаблонів. Для заміни використовується метод Replace. Він, як і метод Matches, перевантажений. Replace може приймати 10 комбінацій параметрів. Я не буду перераховувати тут усе – ви можете знайти їх в MSDN або в Object Browser. Метод може приймати комбінації з наступних параметрів:


  • input – Вихідна рядок.
  • replacement – Рядок, на яку будуть замінені знайдені підрядка.
  • count – Максимальна кількість замін.
  • startat – Позиція в рядку input, з якої буде проводитися заміна.
  • pattern – Замінюваний шаблон.
  • options – Опції. Може приймати константи з перерахування RegExOptions.
  • evaluator – Об’єкт MatchEvaluator.

Метод повертає змінну типу String – рядок, в якій були зроблені заміни.

Dim regexp As New System.Text.RegularExpressions.Regex(“<(.*?)>”)
Dim InputString As String
InputString = “p> Це
приклад pfvtys
txtText.Text = regexp.Replace (txtText.Text, “[вирізано]”, RegexOptions.Multiline)

Порівняння


Порівняння рядки з шаблоном – найпростіша операція, яку можна зробити за допомогою класу RegEx. Порівняння здійснюється методом IsMatch. Він перевантажений і може приймати такі ж параметри, як і метод Matches. Повертане значення має тип Boolean. Метод повертає True, якщо тестуєма рядок збігається з шаблоном і False в протилежному случае.Ніже наведено приклад порівняння рядка з шаблоном.

Dim regexp As New System.Text.RegularExpressions.RegEx (“[0-9]+”)
Dim str As String
str = “1234567890”
MsgBox (regexp.IsMatch(str).ToString)
str = “abc”
MsgBox (regexp.IsMatch(str).ToString)


Поділ рядки


Поділ рядка використовується рідше за інших операцій. Поділ рядки з використанням регулярних виразів дуже схоже зі звичайним поділом рядка функцією Split. Але якщо в Split як роздільник використовувалася рядок, то тут роздільником є ​​регулярне вираження.

Для поділу рядка використовується перевантажений метод Split класу RegEx. Він може приймати такі ж комбінації параметрів, як і методи Matches і IsMatch. Split повертає масив типу String, який містить рядки, отримані з початкової рядка. Масив індексується з нуля.

Наведу невеликий приклад. Припустимо, вам потрібно розбити рядок за кількома роздільникам (скажімо, “-“, “.” І “,”). Можна використовувати для цього функцію Split, але при цьому буде багато метушні з масивами, код буде сильно захаращений і знизиться швидкодію. А тепер подивимося, як легко ця операція буде проведена з використанням регулярних виразів. Роздільником буде наступний вираз: “[-.,]”. Наступний код розбиває рядок на підрядка з використанням цього шаблону.

Dim regexp As New Regex(“[-.,]”)
Dim i As Integer
Dim s() As String
Dim str As String
str = “раз-два, трі.четире, п’ять”
s = regexp.Split(str)
For i = 0 To s.GetUpperBound(0)
Console.WriteLine(s(i))
Next

Компілюють регулярні вираження


За замовчуванням RegEx компілює регулярні вирази в послідовність внутрішніх байт-кодів регулярних виразів (це високорівнева код). При виконанні регулярних виразів відбувається інтерпретація байт-коду.

Якщо при створенні об’єкта RegEx в конструкторі New була встановлена ​​константа Compiled, то RegEx буде скомпільований в MSIL (Microsoft intermediate language). Це дозволить JIT-компілятору перетворити вираження в машинний код, що значно підвищує продуктивність.

Однак чином компілювати виразах є і погана сторона – їх не можна вивантажити з пам’яті. Компілюють регулярні вирази вивантажуються тільки при завершенні роботи всього програми. RegEx залишається в пам’яті, навіть коли сам об’єкт звільнений і знищений складальником сміття.

Тому, слід замислитися над тим, чи варто встановлювати прапор Compiled. Якщо ви постійно використовуєте кілька регулярних виразів, то краще буде їх скомпілювати.

Висновок


Регулярні вирази – потужна технологія для роботи з текстом. Радує те, що розробники Microsoft все-таки вбудували підтримку цієї технології в. NET Framework. Можливо, вони зробили це тому що. NET Framework використовується в Web-додатках (ASP. NET), де регулярні вирази найбільше необхідні.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*