Регулярний вираз

  1. Матеріал з Xgu.ru Дана сторінка знаходиться в розробці . Ця сторінка ще не закінчена. Інформація,...
  2. [ правити ] expr
  3. [ правити ] sed
  4. [ правити ] awk
  5. [ правити ] python
  6. [ правити ] Мови програмування
  7. [ правити ] Python
  8. [ правити ] JavaScript
  9. [ правити ] Clojure
  10. [ правити ] Рекурсивні регулярні вирази
  11. [ правити ] Питання та відповіді
  12. [ правити ] Чим можна замінити negative look-behind assertions?
  13. [ правити ] Чи можна використовувати іменовані capture-групи для множинного захоплення?

Матеріал з Xgu.ru Дана сторінка знаходиться в розробці

.
Ця сторінка ще не закінчена. Інформація, представлена ​​тут, може виявитися неповною або неправильною.

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

Some people, when confronted with a problem, think,
«I know, I'll use regular expressions».
Now they have two problems.

Jamie Zawinski, August 1997

Регулярний вираз (regular expression, regexp) -

Регулярний вираз - це символьна послідовність (рядок), яка описує безліч інших рядків, які відповідають певним вимогам за складом і порядку символів. Регулярні вирази нагадують файлові шаблони, але є набагато більш потужним і гнучким інструментом. Наприклад, файловий шаблон lin * .xml описує безліч рядків, що починаються символами lin і завершуються символами .xml. Регулярний вираз, що описує такі ж послідовності, виглядає як lin. * \. Xml. Зверніть увагу на точку перед зірочкою і зворотну косу риску перед .xml.

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

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

. Символ. Будь-який символ; \ Символ Символ. Безпосередньо символ наступного за екрануючої зворотною косою межею \. Наприклад, \ $ означає символ $, \ ^ - символ ^, \\ - символ \; [...] Символ. Символьний клас: входження будь-якого символу з рядка, перерахованої в квадратних дужках. Допускається зазначення інтервалу: сімвол1-сімвол2 відповідає послідовності символів, починаючи з сімвола1 і закінчуючи сімволом2. Якщо знак `- 'вказано на початку або кінці символьного класу, він означає самого себе - символ дефіса. Інвертований символьний клас означає наявність будь-якого символу, крім символів, перерахованих в його складі. Інвертований символьний клас позначається символом ^, наступним відразу ж за відкриває квадратної дужкою. Символ ^, розташований в будь-якому іншому місці класу не має ніякого спеціального значення. Спеціальні символи регулярних виразів (/, *, + і т.д.), можуть бути вказані в складі символьного класу без екранування; ^ Місцезнаходження. Початок рядка; $ Місцезнаходження. Кінець рядка; елемент * Повторення. Нуль або більше повторення попереднього елемента; елемент + Повторення. Один або більше повторення попереднього елемента; елемент? Повторення. Нуль або одне повторення попереднього елемента; елемент {n} Повторення. Рівне n повторення попереднього елемента. елемент {n, m} Повторення. Від n до m повторення попереднього елемента. елемент1елемент2 Конкатенація. елемент1 слід за елементом2; елемент1 | елемент2 Вибір. Присутній елемент1 або елемент2; (Вираз) Угруповання. вираз розглядається як один елемент;

Можливості мови регулярних виразів далеко не обмежуються перерахованими вище. Існують інші спеціальні символи, що дозволяють описувати кордону слова, зворотні посилання на текст, розподілені повторення і багато інших послідовності.

Різні діалекти мови регулярних виразів можуть відрізнятися за способом запису деяких спеціальних символів: наприклад, угруповання може виглядати як \ (\) замість ().

Регулярні вирази підкоряються двом правилам:

  • При пошуку рядка по регулярному виразу знаходиться перший відповідність максимальної довжини;
  • Пошук є жадібним або максимальним, тобто з декількох символьних послідовностей відповідних заданому регулярному виразу, які починаються з однієї позиції в тексті вибирається найбільша (регулярний вираз (. *) виділить в рядку (a + b) * c + (d + e) ​​* f ні (a + b) якомога було б подумати, а (a + b) * c + (d + e));

Приклад. Регулярні вирази

Будь-яка послідовність символів. Символ. означає будь-який символ, а йде за ним символ * означає, що попередній символ (.) може зустрітися нуль і більше разів. Таким чином, рядок означає будь-яку послідовність символів будь-якої довжини.

. *

Рядок містить слово linux.

linux

Рядок, що містить слово linux і нічого крім нього, тобто рядок рівна linux.

^ Linux $

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

"[^"] * "

Програми, що використовують регулярні вирази.

Програми, що використовують регулярні вирази

Деякі з перерахованих програм є інтерпретаторами мов програмування. У цьому розділі робиться наголос на використання однорядкових програм на цих мовах, іншими словами, тобто на застосування інтерпретатора мови як ще однієї утиліти UNIX / Linux. Детальніше про використання регулярних виразів в різних мови програмування в наступному розділі.

[ правити ] grep

[ правити ] find

[ правити ] expr

[ правити ] bash

[ правити ] sed

[ правити ] vim

[ правити ] awk

[ правити ] perl

[ правити ] python

[ правити ] ruby

[ правити ] Мови програмування

[ правити ] Perl

[ правити ] Python

[ правити ] Ruby

[ правити ] JavaScript

[ правити ] Java

[ правити ] Clojure

[ правити ] Lookbehind- і lookahead- assertions

(? = Pattern) is a positive look-ahead assertion (?! Pattern) is a negative look-ahead assertion (? <= Pattern) is a positive look-behind assertion (? <! Pattern) is a negative look-behind assertion

[1]

[ правити ] Рекурсивні регулярні вирази

[ правити ] Корисні Інтернет-джерела та Інтернет-ресурси

  • Regexper (Англ.) - визуализатор регулярних виразів
  • Істинне могутність регулярних виразів (Рус.) - невеликий огляд теми контекстно-вільних і контекстно-залежних граматик і того, яке відношення це має до регулярних виразах

[ правити ] Питання та відповіді

[ правити ] Як інвертувати регулярний вираз в Пітоні?

до куди я поки дійшов:

>>> a = 'example: "quick" "brown" fox jumps "over" "the" lazy dog' >>> print [0] + list (itertools.chain (* [x.span () for x in re .finditer ( ' "[^"] * "', a)])) + [-1] [0, 9, 16, 17, 24, 35, 41, 42, 47, -1]

заготовки:

[ правити ] Чим можна замінити negative look-behind assertions?

Варіантів кілька.

По-перше, деякі діалекти регулярних виразів це вміють і так. Наприклад, вміє Perl 6 і регулярні вирази з .NET [1] .

По-друге, інвертувати регулярний вираз і текст і використовувати look-ahead assertion :)

По-третє, ...

[ правити ] Чи можна використовувати іменовані capture-групи для множинного захоплення?

Чи можна зробити так, грубо кажучи, щоб отримати масив або список відповідностей подвираженія, що знаходиться в групі захоплення?

Щось подібне є в Perl 6 і в регулярних виразах .NET. Детальніше: [2] .

  1. http://oylenshpeegul.typepad.com/blog/2011/12/variable-length-look-behind-in-regular-expressions.html про negative look-behind assertions змінної довжини
Правити ] Чи можна використовувати іменовані capture-групи для множинного захоплення?
Один або більше повторення попереднього елемента; елемент?
Правити ] Чи можна використовувати іменовані capture-групи для множинного захоплення?
Чи можна зробити так, грубо кажучи, щоб отримати масив або список відповідностей подвираженія, що знаходиться в групі захоплення?