Регулярний вираз
- Матеріал з Xgu.ru Дана сторінка знаходиться в розробці . Ця сторінка ще не закінчена. Інформація,...
- [ правити ] expr
- [ правити ] sed
- [ правити ] awk
- [ правити ] python
- [ правити ] Мови програмування
- [ правити ] Python
- [ правити ] JavaScript
- [ правити ] Clojure
- [ правити ] Рекурсивні регулярні вирази
- [ правити ] Питання та відповіді
- [ правити ] Чим можна замінити negative look-behind assertions?
- [ правити ] Чи можна використовувати іменовані 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] .
- ↑ http://oylenshpeegul.typepad.com/blog/2011/12/variable-length-look-behind-in-regular-expressions.html про negative look-behind assertions змінної довжини
Один або більше повторення попереднього елемента; елемент?
Правити ] Чи можна використовувати іменовані capture-групи для множинного захоплення?
Чи можна зробити так, грубо кажучи, щоб отримати масив або список відповідностей подвираженія, що знаходиться в групі захоплення?