Конструкції угруповання в регулярних виразах

Конструкції групування відображають частини виразів регулярних виразів і захоплюють частини рядка вхідного рядка. Конструкції групування можна використовувати в наступних цілях.

Зіставлення з частиною вираження, яка повторюється у вхідному рядку.

Застосування квантіфікатор до частини виразу з кількома мовними елементами регулярних виразів. Додаткові відомості про квантіфікатор см. В розділі Квантори в регулярних виразах.

Додавання в рядок частини виразу, яка повертається методами Regex. Replace і Match. Result.

Витяг окремих частин висловлювання з властивості Match.Groups і обробка їх окремо від всього тексту.

У цій таблиці наведено конструкції групування, підтримувані механізмом регулярних виразів .NET Framework, і показано, чи є вони захоплюють або незахвативаемимі.

Де name1 - поточна група (необов'язковий параметр), name2 - раніше задана група, а subexpression - будь-який допустимий шаблон регулярного виразу. Це збалансоване визначення групи видаляє визначення name2 і зберігає інтервал між name2 і name1 в name1. Якщо група name2 не визначена, для відповідності виконується зворотний пошук. Так як видалення останнього визначення name2 надає доступ до попереднього визначенням name2. ця конструкція дозволяє використовувати стек виділень для групи name2 як лічильник вкладений конструкцій, наприклад круглих дужок або відкривають і закривають квадратних дужок.

Збалансоване визначення групи використовує в якості стека name2. Початковий символ кожної вкладеної конструкції розміщується в групі і в колекції Group.Captures. При зіставленні закриває символу відповідний відкриває символ видаляється з групи, а колекція Captures зменшується на один елемент. Після зіставлення відкривають і закривають символів всіх вкладених конструкцій, група name1 марна.

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

У наступному прикладі збалансоване визначення групи використовується для зіставлення лівої і правої кутової дужки (<>) У вхідному рядку. У прикладі визначені дві іменовані групи, Open і Close. які використовуються як стек для відстеження відповідних пар кутових дужок. Кожна виділена ліва кутова дужка поміщається в колекцію групи Open. а кожна виділена права кутова дужка поміщається в колекцію групи Close. Збалансоване визначення групи дозволяє переконатися, що для кожної лівої кутової дужки існує відповідна права кутова дужка. В іншому випадку останній подшаблон, (? (Open) (?!)). обчислюється, тільки якщо група Open не порожня (отже, всі вкладені конструкції не закриті). Якщо останній подшаблон обчислюється, зіставлення викликає помилку, так як подшаблон (?!) Є твердженням негативного пошуку вперед нульовий ширини, яке завжди повертає помилку.

Наступна конструкція угруповання застосовує або відключає зазначені параметри в частині вираження:

Де частина виразу - будь-який допустимий шаблон регулярного виразу. Наприклад, (? I-s :) відключає чутливість до регістру та однорядковий режим. Додаткові відомості про доступні вбудованих параметрах см. В розділі Параметри регулярних виразів.

Ви можете вказати параметри, які застосовуються до всього регулярному виразу, а не його частини, використовуючи конструктор класу System.Text.RegularExpressions. Regex або статичний метод. Також можна вказати вбудовані параметри, які застосовуються після певної точки в регулярному виразі з використанням мовної конструкції (? Imnsx-imnsx).

Конструкція параметрів групи не є захоплюваної групою. Це означає, що незважаючи на те, що будь-яка частина рядка, захоплююча частиною вираження. включається у відповідність, вона не додається в захоплювану групу і не використовується для заповнення об'єкта GroupCollection.

Наприклад, регулярний вираз \ b (? Ix: d \ w +) \ s в наступному прикладі використовує вбудовані параметри в конструкції угруповання, щоб включити зіставлення без урахування регістру і ігнорувати прогалини при визначенні слів, що починаються з літери "d". Визначення регулярного виразу показано в таблиці нижче.

Збіг має закінчуватися на кордоні слова.

Де частина виразу - будь-який шаблон регулярного виразу. Для успішного зіставлення частина виразу не повинна перебувати у вхідному рядку зліва від поточної позиції. Однак будь-яка подстрока, яка не відповідає subexpression. не включається до результат зіставлення.

Наступний приклад зіставляє дату кожного дня буднього тижні (т. Е. Суботи або неділі).

Підрядки, зіставляються захоплюваної групою регулярного виразу, представлені об'єктами System.Text.RegularExpressions. Group. які можна отримати з об'єкта System.Text.RegularExpressions. GroupCollection. що повертається властивістю Match.Groups. Об'єкт GroupCollection заповнюється наступним чином:

Перший об'єкт Group в колекції (об'єкт з нульовим індексом) представляє всі зіставлення.

Останній набір об'єктів Group представляє іменовані захоплювані групи. Вони вказуються в тому порядку, в якому вони визначені в регулярному виразі, зліва направо. Значення індексу першої іменованої захоплюваної групи на одиницю більше індексу, останньої неіменованого захоплюваної групи. Якщо в регулярному виразі немає неназваних захоплюваних груп, індекс першої іменованої захоплюваної групи дорівнює одиниці.

Якщо до захоплюваної групі застосовується квантіфікатор, відповідні властивості Group. Capture.Value і Capture.Index об'єкта Capture.Length відображають останню подстроку, що виділяється захоплюваної групою. Ви можете отримати повний набір подстрок, що виділяються групами з квантіфікаторамі, з об'єкта CaptureCollection. що повертається властивістю Group.Captures.

У наступному прикладі показано зв'язок між об'єктами Group і Capture.

Схожі статті