Статьи

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

  1. Регулярні вирази Основні технології створення і використання регулярних виразів на UNIX-системах...
  2. Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу
  3. Маркування за допомогою grep
  4. Малюнок 1. Виділені кольором збіглися підрядка в grep
  5. Маркування за допомогою sed
  6. Приклад 2. Збіги рядків, відмічені sed
  7. Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки
  8. Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed
  9. Виділення кольором за допомогою Emacs
  10. Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  11. Відображення лише збігів, а не рядків цілком
  12. Відображення лише збігів за допомогою grep
  13. Приклад 4. Збір всіх слів з тексту
  14. Приклад 5. Висновок всіх слів, що містять th. Перша спроба
  15. Приклад 6. Виводимо всі слова з th. друга спроба
  16. Приклад 7. Висновок всіх слів, що містять th. третя спроба
  17. Відображення лише збігів з використанням sed
  18. Приклад 8. Висновок тільки збіглися символів за допомогою sed
  19. Відображення лише збігів з Perl
  20. Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest
  21. Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest
  22. Приклад 10. Запуск pcretest з вхідним файлом
  23. Використання майстра створення регулярних виразів
  24. Створення регулярного виразу
  25. Малюнок 4. Створення регулярного виразу за допомогою txt2regex
  26. Приклад 11. Неправильне зіставлення слів з апострофом
  27. Приклад 12. Правильне зіставлення слів з апострофом
  28. Приклад 13. Зіставлення слів, що містять th за допомогою grep
  29. Короткі відомості про опції регулярних виразів
  30. Приклад 14. Одержання короткого огляду правил регулярних виразів за допомогою txt2regex
  31. Отримання готових регулярних виразів
  32. Таблиця 2. Список готових регулярних виразів, що надаються txt2regex
  33. Приклад 15. Отримання регулярного виразу для роботи з часом від txt2regex
  34. список метасимволов
  35. Приклад 16. Відображення всіх метасимволов за допомогою txt2regex
  36. вивчення документів
  37. Висновок
  38. Ресурси для скачування
  39. Регулярні вирази
  40. Маркування збігів в залежності від їх контексту
  41. Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу
  42. Маркування за допомогою grep
  43. Малюнок 1. Виділені кольором збіглися підрядка в grep
  44. Маркування за допомогою sed
  45. Приклад 2. Збіги рядків, відмічені sed
  46. Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки
  47. Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed
  48. Виділення кольором за допомогою Emacs
  49. Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  50. Відображення лише збігів, а не рядків цілком
  51. Відображення лише збігів за допомогою grep
  52. Приклад 4. Збір всіх слів з тексту
  53. Приклад 5. Висновок всіх слів, що містять th. Перша спроба
  54. Приклад 6. Виводимо всі слова з th. друга спроба
  55. Приклад 7. Висновок всіх слів, що містять th. третя спроба
  56. Відображення лише збігів з використанням sed
  57. Приклад 8. Висновок тільки збіглися символів за допомогою sed
  58. Відображення лише збігів з Perl
  59. Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest
  60. Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest
  61. Приклад 10. Запуск pcretest з вхідним файлом
  62. Використання майстра створення регулярних виразів
  63. Створення регулярного виразу
  64. Малюнок 4. Створення регулярного виразу за допомогою txt2regex
  65. Приклад 11. Неправильне зіставлення слів з апострофом
  66. Регулярні вирази
  67. Маркування збігів в залежності від їх контексту
  68. Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу
  69. Маркування за допомогою grep
  70. Малюнок 1. Виділені кольором збіглися підрядка в grep
  71. Маркування за допомогою sed
  72. Приклад 2. Збіги рядків, відмічені sed
  73. Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки
  74. Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed
  75. Виділення кольором за допомогою Emacs
  76. Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  77. Відображення лише збігів, а не рядків цілком
  78. Відображення лише збігів за допомогою grep
  79. Приклад 4. Збір всіх слів з тексту
  80. Приклад 5. Висновок всіх слів, що містять th. Перша спроба
  81. Приклад 6. Виводимо всі слова з th. друга спроба
  82. Приклад 7. Висновок всіх слів, що містять th. третя спроба
  83. Відображення лише збігів з використанням sed
  84. Приклад 8. Висновок тільки збіглися символів за допомогою sed
  85. Відображення лише збігів з Perl
  86. Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest
  87. Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest
  88. Приклад 10. Запуск pcretest з вхідним файлом
  89. Використання майстра створення регулярних виразів
  90. Створення регулярного виразу
  91. Малюнок 4. Створення регулярного виразу за допомогою txt2regex
  92. Приклад 11. Неправильне зіставлення слів з апострофом
  93. Приклад 12. Правильне зіставлення слів з апострофом
  94. Приклад 13. Зіставлення слів, що містять th за допомогою grep
  95. Короткі відомості про опції регулярних виразів
  96. Приклад 14. Одержання короткого огляду правил регулярних виразів за допомогою txt2regex
  97. Отримання готових регулярних виразів
  98. Таблиця 2. Список готових регулярних виразів, що надаються txt2regex
  99. Приклад 15. Отримання регулярного виразу для роботи з часом від txt2regex
  100. список метасимволов
  101. Приклад 16. Відображення всіх метасимволов за допомогою txt2regex
  102. вивчення документів
  103. Висновок
  104. Ресурси для скачування

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

Основні технології створення і використання регулярних виразів на UNIX-системах

Концепція регулярних виразів (regexps) - позначень для опису шаблонів, відповідних набору рядків - є спільною для безлічі програм і мов програмування. Різні реалізації регулярних виразів відрізняються один від одного в деталях, але принципи, необхідні для навчання створенню регулярних виразів, однакові у всіх їх реалізаціях.

Ця стаття розглядає кілька корисних інструментальних засобів і прийомів для навчання створенню і поліпшенню регулярних виразів для ряду додатків UNIX®, таких як:

Маркування збігів в залежності від їх контексту

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

Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу

$ Cat midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Grep t [az] midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $

Так як регулярний вираз знаходить принаймні один збіг із зразком в кожному рядку, команда grep записує кожну строчку у вхідний файл. Але для яких саме символів з рядків знайдено збіг з регулярним виразом?

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

Ви можете здійснити це за допомогою декількох додатків, включаючи grep, sed і Emacs.

Маркування за допомогою grep

Деякі з новітніх версій grep (такі як GNU grep ) Відзначають кольором регулярний вираз, коли ви використовуєте опцію --color, як показано на малюнку 1 .

Малюнок 1. Виділені кольором збіглися підрядка в grep

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

Маркування за допомогою sed

Ви також можете маркувати регулярний вираз за допомогою потокового редактора sed. Команда sed:

'S / regexp / [&] / g'

Вона укладає в квадратні дужки всі збіги зі зразком, відмічені регулярним виразом. приклад 2 показує результати роботи sed на нескладному тексті.

Приклад 2. Збіги рядків, відмічені sed

$ Sed 's / t [az] / [&] / g' midsummer I know a bank where [th] e wild [th] yme blows, Where oxlips and [th] e nodding violet grows, Qui [te] over- canopied wi [th] luscious woodbine, Wi [th] sweet musk-roses and wi [th] eglan [ti] ne. $

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

$ Sed 's / t [az] / \\ fB & \\ fP / g' infile.roff | groff -

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

Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки

#! / Bin / sh # highlights regexp pattern in input file # usage: hre regexp file sed 's /' $ 1 '/ ^ [[34m & ^ [[37m / g' <$ 2

Символ ^ [, який двічі з'являється в прикладі, є символом керуючої послідовності, тому вам треба вводити цей приклад в редакторі, який підтримує введення літеральних символів - наприклад Emacs (де для введення символу керуючої послідовності вам треба ввести Cq ESC). Числа 34 і 37 є кодами інтерпретатора Bash для завдання блакитного і та білого кольорів.

Щоб зробити скрипт виконуваним, надрукуйте:

$ Chmod 744 hre

Потім запустіть його, як показано на малюнку 2 .

Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed

Хоча ви можете визначити колір виділення (маркування) тексту і прості кольори за допомогою цього методу, існують застереження до його використання. Наприклад, скрипт, показаний в прикладі 3 , Працює тільки тоді, коли простий текст у вікні терміналу білого кольору, тому що він відновлює цей колір тексту. Якщо ваш термінал використовує інший колір для відображення простого тексту, поміняйте в скрипті керуючий код. (Наприклад, 30 - це чорний.)

Виділення кольором за допомогою Emacs

У новітніх версіях редактора Emacs функції isearch-forward-regexp і isearch-backward-regexp виділяють всі збіги в буфері. Якщо у вас стоїть остання версія Emacs, спробуйте виконати ці функції зараз:

  1. Запустіть Emacs, надрукувавши: $ emacs midsummer
  2. Введіть наступне: Mx isearch-forward-regexp.

    Послідовність Mx - це умовний знак Emacs для Meta-x, який ви можете ввести в більшості систем або натиснувши і утримуючи клавіші Alt, одночасно натиснувши X, а потім відпустивши обидві клавіші, або натиснувши клавішу Esc, відпустивши її, і потім натиснувши клавішу X.

  3. Створіть регулярний вираз типу: t [az]

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

    Результати вашої роботи з Emacs повинні виглядати приблизно так, як на малюнку 3 .

    Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  4. Введіть Cx Cc щоб вийти з Emacs.

    Ви вводите цю комбінацію шляхом натискання і утримування клавіші Ctrl і одноразового натискання X, повторного натискання і утримування Ctrl з одночасним натисканням клавіші C.

Функцій isearch-forward-regexp і isearch-backward-regexp зазвичай соотвествуют комбінації MSs і MSr. (Щоб створити їх, натисніть і утримуйте Alt, Ctrl і або клавішу S або клавішу R.)

Відображення лише збігів, а не рядків цілком

Є інший підхід до проблеми контексту зразка, який складається тільки в тому, щоб виводити тільки збіги самі по собі, а не рядки, де було знайдено це збіг, цілком. Існує кілька способів щоб зробити це за допомогою grep, sed, і perl.

Відображення лише збігів за допомогою grep

Прапор --only-matching (або по-іншому -o) змінює поведінку grep так, що команда висновок не цілком рядки, в яких знайшлися збіги з шаблоном регулярного виразу, а тільки самі збіги. Разом з прапором --color, описаним вище , Ця можливість з'явилася в новітніх реалізаціях деяких версій grep, включаючи GNU grep, у якого відкритий вихідний код і який доступний для багатьох операційних систем.

Отже, цей прапор призначений для збору даних, які задовольняють умові в регулярному виразі, тому він ідеально підходить для збору IP-адрес, URL-посилань, імен, адрес електронної пошти, і т.п., але крім усього іншого це ще й відмінний спосіб отримати регулярні вирази. наприклад, приклад 4 показує як використовувати цей прапор, щоб отримати всі слова з досліджуваного тексту з прикладу 1 . Він виводить кожне слово в окремий рядок.

Приклад 4. Збір всіх слів з тексту

$ Egrep -o '[A-Za-z] +' midsummer I know a bank where the wild thyme blows Where oxlips and the nodding violet grows Quite over canopied with luscious woodbine With sweet musk roses and with eglantine $

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

Припустимо, потрібно вивести всі слова з текстового файлу, що містять рядок th, і ви створили регулярний вираз для реалізації цього, як показано в прикладі 5 .

Приклад 5. Висновок всіх слів, що містять th. Перша спроба

$ Egrep -o 'th [az] *' midsummer the thyme the th th th $

Регулярний вираз не працює. Видно, що деякі з результатів, виведених регулярним виразом, взагалі не є словами. Краще спробуйте заново: приклад 6 враховує також будь-які символи в словах, які можуть передувати th.

Приклад 6. Виводимо всі слова з th. друга спроба

$ Egrep -o '[az] * th [az] *' midsummer the thyme the with ith with $

Вже набагато краще, але поки ще не ідеальний результат. Рядок th говорить про те, що регулярний вираз не сприймає великі букви, коли шукає збіги зі своїм зразком. Виправте це за допомогою прапора -i, як показано в прикладі 7 .

Приклад 7. Висновок всіх слів, що містять th. третя спроба

$ Egrep -o -i '[az] * th [az] *' midsummer the thyme the with With with

Тепер те, що треба!

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

Відображення лише збігів з використанням sed

Ви можете робити речі, як в попередньому пункті, вже з використанням команди sed:

s /.* \ (regexp \). * / \ 1 / p

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

Приклад 8. Висновок тільки збіглися символів за допомогою sed

$ Sed -n 's /.* \ (th [az] \). * / \ 1 / p' midsummer thy the $ grep -o th [az] midsummer the thy the $

Відображення лише збігів з Perl

Регулярні вирази також активно використовуються в мові програмування Perl, але регулярні вирази в Perl відмінні від тих, що ви будували за допомогою команди grep. Інструментальне засіб pcretest дозволяє протестувати регулярні вирази в Perl. Можна використовувати цей інструментарій, щоб ознайомиться з Perl-сумісної бібліотекою регулярних виразів (PCRE), і для того, щоб налагодити або протестувати регулярні вирази, які були створені за допомогою цього інструментального засобу.

Зазвичай регулярний вираз полягає в символи-Слеш (/) і супроводжується модифікаторами, які вносять зміни в механізм пошуку. Найбільш поширені модифікатори регулярних виразів представлені в таблиці 1 .

Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest

Модифікатор Опис 8 Цей модифікатор додає підтримку символів Unicode (UTF-8). g Цей модифікатор шукає глобальні збіги (більше ніж по одному на рядок). i Цей модифікатор дозволяє ігнорувати регістр символів. m Цей модифікатор дає можливість пошуку на декількох рядках. x Цей модифікатор використовує розширені регулярні вирази Perl.

Спробуйте запустити pcretest, як показано на малюнку 9 .

Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest

$ Pcretest PCRE version 6.7 04-Jul-2006 re> / [az] * th [az] * / ig data> With sweet musk-roses and with eglantine. 0: With 0: with data> $

Також можна запустити pcretest з вхідним файлом, який містить регулярний вираз, яке треба протестувати на одній тільки рядку або сукупності рядків. У вас можуть бути складові регулярні вирази і зразки для порівнювання, тоді вони повинні бути відокремлені один від одного порожнім рядком. pcretest продовжує шукати збіги для зразка регулярного виразу у вхідних даних до тих пір, поки він не досягне кінця файлу (EOF).

Якщо ви надасте pcretest ім'я другого файлу, то він буде виводити результати в нього. В іншому випадку він здійснює стандартний висновок, як показано в прикладі 10 .

Приклад 10. Запуск pcretest з вхідним файлом

$ Cat midsummer.pre / w [hi] | th / gi I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Pcretest midsummer.pre PCRE version 6.7 04-Jul-2006 / w [hi] | th / gi I know a bank where the wild thyme blows, 0: wh 0: th 0: wi 0: th Where oxlips and the nodding violet grows, 0: Wh 0: th Quite over-canopied with luscious woodbine, 0: wi 0: th With sweet musk-roses and with eglantine. 0: Wi 0: th 0: wi 0: th $

Використання майстра створення регулярних виразів

txt2regex є інтерактивним крос-платформних майстром для створення регулярних виразів для інтерпретатора Bash. Коли ви його запускаєте, він задає ряд питань про зразок, з яким потрібно шукати збіги і потім створює коректне регулярний вираз для будь-якого з двох дюжен різних додатків:

  • awk;
  • ed;
  • egrep;
  • emacs;
  • expect;
  • find;
  • gawk;
  • grep;
  • javascript;
  • lex;
  • lisp;
  • mawk;
  • mysql;
  • ooo;
  • perl;
  • php;
  • postgres;
  • procmail;
  • python;
  • sed;
  • tcl;
  • vbscript;
  • vi;
  • vim.

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

Створення регулярного виразу

Щоб створити регулярний вираз для одного або більше підтримуваних txt2regex додатків , Розділяйте імена цих додатків коми. І використовуйте цей список в якості аргументу до прапора --prog.

Почніть з спроби створення регулярного виразу як в розділі Виділені кольором збіги , Яке шукає збіги для символу Т, прямо за яким слідує буква в нижньому регістрі:

  1. Запустіть txt2regex і визначте регулярні вирази для grep, sed, і Emacs: $ txt2regex --prog grep, sed, emacs
  2. Ви хочете шукати збіги для букви Т в будь-якій частині рядка, а не тільки в її початку, тому введіть 2 для вибору умови "в будь-якій частині рядка".
  3. Введіть 2 знову виберіть пункт "конкретний символ" і потім введіть t, коли будуть запитано, для якого саме символу шукати збіги.

    Тепер вам слід відповісти на питання скільки збігів вам треба знайти.

  4. Введіть 1, щоб точно визначити максимум збігів, які треба знайти.
  5. Для зіставлення букв нижнього регістру, введіть 6 щоб вибрати "особливу комбінацію символів" і потім введіть b для зіставлення букв нижнього регістру. Введіть. для виходу в головне меню txt2regex.
  6. Для зіставлення букв нижнього регістру тільки один раз введіть 1.

Після того як ви повністю визначте, яке регулярне вираз вам потрібно, txt2regex створить регулярний вираз для кожного з трьох обраних додатків і відобразить їх у верхній частині екрану. Отже, після того як ви точно визначилися з бажаною функціональністю регулярного виразу, можна побачити його в версіях для всіх трьох додатків на малюнку 4 .

Малюнок 4. Створення регулярного виразу за допомогою txt2regex

Введіть .. для виходу. Список регулярних виразів залишиться на вашому терміналі.

Так, вийшло так, що всі три регулярних вирази однакові t [az], але це тільки тому, що у нас досить просте регулярний вираз і три обрані додатки мають єдиний синтаксис для регулярних виразів. І далеко не завжди регулярні вирази будуть однакові для всіх трьох обраних додатків.

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

  1. Запустіть txt2regex без будь-яких прапорів: $ txt2regex
  2. Введіть 2 для пошуку збігів в будь-якій частині рядка.
  3. Введіть 6 щоб задати спеціальну комбінацію і потім введіть a і b для вибору всіх букв вернего або нижнього регістру.
  4. Введіть. для повернення в головне меню а потім введіть 4 щоб визначити, що потрібно шукати одне або більше збігів.

Без прапорів, тобто за замовчуванням, txt2regex створить регулярні вирази для наступних додатків і мов: perl, php, postgres, python, sed, and vim. Коли ви пройдете всі етапи, описані вище, при створенні регулярного виразу, виявиться, що перші чотири додатки використовують ті ж регулярні вирази, що були використані з grep в прикладі 4 , Але регулярні вирази для sed і vim відрізняються один від одного незначно. Це тому, що ці додатки використовують дещо різні набори метасимволов, як буде описано нижче .

І знову введіть .. для виходу з програми; регулярні вирази для різних програм залишаться на вашому терміналі. Ви можете використовувати їх такими або покращувати їх далі. Наприклад, як щодо пошуку збігів для слів, що містять символ апострофа ( ') & # 151; do not, who're, e'er, owner's, 'cause, Joe's і тому подібних? Регулярний вираз, яке ви створили тільки що, не зможе коректно зіставляти такі слова (див. приклад 11 ).

Приклад 11. Неправильне зіставлення слів з апострофом

$ Echo "Do not miss a word, just 'cause it's wrong." | egrep [A-Za-z] + Don t miss a word just cause it s wrong $

Вам треба додати символ апострофа до списку в квадратних дужках. Результат роботи регулярного виразу показаний в прикладі 12 . Зверніть увагу, що зараз регулярний вираз укладено в лапки.

Приклад 12. Правильне зіставлення слів з апострофом

$ Echo "Do not miss a word, just 'cause it's wrong." | egrep "[A-Za-z '] +" Do not miss a word just' cause it's wrong $

Наступне регулярний вираз, котороерассматрівалось в розділі Як показати тільки самі збіги, а не рядок цілком було для одиночних слів, що містять в будь-якій своїй частині поєднання символів th. Ви використовували регулярні вирази для egrep, sed, і perl; тепер спробуємо створити його для grep:

  1. Запустіть txt2regex: $ txt2regex
  2. Введіть / для вибору доступних програм і введіть hkopqstx .. Таким чином буде створено регулярний вираз тільки для grep.
  3. Введіть 26ab.3 для можливості пошуку потрібного поєднання букв верхнього або нижнього регістру де завгодно в рядку.
  4. Введіть 2t12h1 для завдання символів, яким шукати збіги - T і H, наступними один за одним, причому це поєднання, TH, зустрічається тільки один раз в слові.
  5. Введіть 6ab.3 для можливості пошуку послідовності букв th; будь-якого регістра.
  6. Введіть ..для виходу з програми.

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

Приклад 13. Зіставлення слів, що містять th за допомогою grep

$ Grep -o [A-Za-z] * th [A-Za-z] * midsummer the thyme the with With with $

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

Опція (прапор) --showinfo виводить коротке зведення інформації про створення регулярних виразів конкретно для будь-якої мови або програми. У виведену інформацію включається назва і версія додатка, метасимволу регулярного виразу, символ за замовчуванням зазначеного подвираженія ( "\"), яке може бути використано пізніше, метасимволу, перед якими треба ставити "\", чи можете ви використовувати в квадратних дужках символ табуляції ( "\ t") і підтримує мову або додаток вираження, що укладаються в квадратні дужки, певні в Portable Operating System Interface (POSIX).

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

Приклад 14. Одержання короткого огляду правил регулярних виразів за допомогою txt2regex

$ Txt2regex --showinfo javascript program javascript: netscape-4.77 metas. [] [^] * +? {} | () Esc meta \ need esc \. * [{(| +? ^ $ \ T in [] YES [: POSIX:] NO $ txt2regex --showinfo php program php: 4.0.6 metas. [] [^] * +? {} | () esc meta \ need esc \. * [{(| +? ^ $ \ t in [] YES [: POSIX:] YES $

Отримання готових регулярних виразів

Опція --make описана своїм автором як a remedy for headaches (ліки від головного болю). Воно виводить регулярні вирази для одного з декількох загальних зразків, які задаються як параметри. Список готових регулярних виразів показаний в таблиці 2 .

Таблиця 2. Список готових регулярних виразів, що надаються txt2regex

Аргумент Опис date Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/0000 до 99/99/9999. date2 Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/1000 до 19/39/2999. date3 Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/1000 до 12/31/2999. hour Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 99:99. hour2 Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 29:59. hour3 Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 23:59. number Цей парамеір відповідає будь-якому позитивному чи негативному целочисленному значенням. number2 Цей параметр відповідає будь-якому позитивному чи негативному цілому числу з додатковими розрядами після коми. number3 Цей параметр відповідає позитивному або негативному цілому числу з додатковими запитом і додатковим значенням після коми.

Наприклад, ви можете використовувати ці параметри щоб отримати свої формальні вирази для роботи з військовим часом, як показано в прикладі 15 .

Приклад 15. Отримання регулярного виразу для роботи з часом від txt2regex

$ Txt2regex --make hour3 RegEx perl: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx php: ([01] [0-9] | 2 [0123] ): [012345] [0-9] RegEx postgres: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx python: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx sed: \ ([01] [0-9] \ | 2 [0123] \): [012345] [0-9] RegEx vim: \ ([ 01] [0-9] \ | 2 [0123] \): [012345] [0-9] $

список метасимволов

Іншою корисною можливістю txt2regex є опція --showmeta, яка виводить таблицю, яка містить всі метасимволу, використовувані при побудові регулярних виразів для програм, які підтримуються і мов. Робота цієї опції показана в прикладі 16 .

Приклад 16. Відображення всіх метасимволов за допомогою txt2regex

$ Txt2regex --showmeta awk +? | () Ed \ + \? \ {\} \ | \ (\) Egrep +? {} | () Emacs +? \ | \ (\) Expect +? | () Find +? \ | \ (\) Gawk +? {} | () Grep \ + \? \ {\} \ | \ (\) Javascript +? {} | () Lex +? {} | () Lisp +? \\ | \\ (\\) mawk +? | () Mysql +? {} | () Ooo +? {} | () Perl +? {} | () Php +? {} | () Postgres +? {} | () Procmail +? | () Python +? {} | () Sed \ + \? \ {\} \ | \ (\) Tcl +? | () Vbscript +? {} | () Vi \ {1 \} \ {01 \} \ {\} \ (\) vim \ + \ = \ {} \ | \ (\) NOTE:. [] [^] And * are the same on all programs. $

вивчення документів

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

Наприклад, синтаксис створення регулярних виразів до grep, sed і інших інструментальних засобів подібного типу, а також приклади до цих регулярними виразами описані в справоной системі man. Якщо у вас встановлені GNU-версії цих додатків, то у них також повинні бути довідкові системи, що містять навіть більше інформації, ніж стандартна довідкова система man. Наприклад, якщо у вас встановлений GNU sed і у вас є файл довідки info, ви можете прочитати керівництво:

$ Info sed

Документація до Perl (зазвичай посталяется окремо від основного комплекту поставки Perl) містить всебічну оперативну сторінку керівництва за регулярними виразами в Perl:

$ Man perlre

І навіть більше! Оперативна сторінка керівництва man для pcrepattern (поставляється з пріложеніемpcretest, як описано вищє ) Також є посібником з регулярними виразами в Perl.

На закінчення, оперативна сторінка керівництва man по regex, доступна на багатьох UNIX-системах, надає інформацію про створення регулярних виразів, що підтримують інтерфейси POSIX. Інформація в цій оперативної сторінці пам'яті взята з бібліотеки регулярних виразів Генрі Спенсера (Henry Spencer's regex library) (див. Додатковий інформацію ).

Висновок

Безліч інструментальних засобів і методів доступні на UNIX-системах для створення регулярних виразів. Ви ознайомилися з кращими з них.

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

Ресурси для скачування

Схожі теми

  • Know your regular expressions : Ознайомтеся з оригіналом статті (EN).
  • " Hone your regexp pattern-building skills "(Michael Stutz, developerWorks, липень 2006): ця стаття описує кілька регулярних виразів для системного адміністрування, які ви, можливо, знайдете корисними для себе.
  • Speaking UNIX, Part 9: Regular expressions (EN) (Martin Streicher, developerWorks, квітень 2007 року): ця стаття являє собою короткий підручник для початківців створювати регулярні вирази.
  • Ознайомтеся з іншими статтями, написаними Міхаелем Штутцом (Michael Stutz):
  • Розділи бібліотеки информации по AIX и UNIX: (EN)
  • Podcasts : Залишайтеся на зв'язку з технічними експертами IBM. (EN)
  • GNU Project Web site : Завантажте безкоштовну копію GNU grep для вашої операційної системи. (EN)
  • PCRE : Завантажте безкоштовну копію PCRE. (EN)
  • txt2regex script : Завантажте безкоштовну копію програми txt2regex. (EN)
  • regex : Завантажте безкоштовну копію бібліотек регулярних виразів Генрі Спенсера (Henry Spencer's regular expression libraries). (EN)

Підпишіть мене на повідомлення до коментарів

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

Основні технології створення і використання регулярних виразів на UNIX-системах

Концепція регулярних виразів (regexps) - позначень для опису шаблонів, відповідних набору рядків - є спільною для безлічі програм і мов програмування. Різні реалізації регулярних виразів відрізняються один від одного в деталях, але принципи, необхідні для навчання створенню регулярних виразів, однакові у всіх їх реалізаціях.

Ця стаття розглядає кілька корисних інструментальних засобів і прийомів для навчання створенню і поліпшенню регулярних виразів для ряду додатків UNIX®, таких як:

Маркування збігів в залежності від їх контексту

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

Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу

$ Cat midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Grep t [az] midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $

Так як регулярний вираз знаходить принаймні один збіг із зразком в кожному рядку, команда grep записує кожну строчку у вхідний файл. Але для яких саме символів з рядків знайдено збіг з регулярним виразом?

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

Ви можете здійснити це за допомогою декількох додатків, включаючи grep, sed і Emacs.

Маркування за допомогою grep

Деякі з новітніх версій grep (такі як GNU grep ) Відзначають кольором регулярний вираз, коли ви використовуєте опцію --color, як показано на малюнку 1 .

Малюнок 1. Виділені кольором збіглися підрядка в grep

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

Маркування за допомогою sed

Ви також можете маркувати регулярний вираз за допомогою потокового редактора sed. Команда sed:

'S / regexp / [&] / g'

Вона укладає в квадратні дужки всі збіги зі зразком, відмічені регулярним виразом. приклад 2 показує результати роботи sed на нескладному тексті.

Приклад 2. Збіги рядків, відмічені sed

$ Sed 's / t [az] / [&] / g' midsummer I know a bank where [th] e wild [th] yme blows, Where oxlips and [th] e nodding violet grows, Qui [te] over- canopied wi [th] luscious woodbine, Wi [th] sweet musk-roses and wi [th] eglan [ti] ne. $

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

$ Sed 's / t [az] / \\ fB & \\ fP / g' infile.roff | groff -

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

Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки

#! / Bin / sh # highlights regexp pattern in input file # usage: hre regexp file sed 's /' $ 1 '/ ^ [[34m & ^ [[37m / g' <$ 2

Символ ^ [, який двічі з'являється в прикладі, є символом керуючої послідовності, тому вам треба вводити цей приклад в редакторі, який підтримує введення літеральних символів - наприклад Emacs (де для введення символу керуючої послідовності вам треба ввести Cq ESC). Числа 34 і 37 є кодами інтерпретатора Bash для завдання блакитного і та білого кольорів.

Щоб зробити скрипт виконуваним, надрукуйте:

$ Chmod 744 hre

Потім запустіть його, як показано на малюнку 2 .

Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed

Хоча ви можете визначити колір виділення (маркування) тексту і прості кольори за допомогою цього методу, існують застереження до його використання. Наприклад, скрипт, показаний в прикладі 3 , Працює тільки тоді, коли простий текст у вікні терміналу білого кольору, тому що він відновлює цей колір тексту. Якщо ваш термінал використовує інший колір для відображення простого тексту, поміняйте в скрипті керуючий код. (Наприклад, 30 - це чорний.)

Виділення кольором за допомогою Emacs

У новітніх версіях редактора Emacs функції isearch-forward-regexp і isearch-backward-regexp виділяють всі збіги в буфері. Якщо у вас стоїть остання версія Emacs, спробуйте виконати ці функції зараз:

  1. Запустіть Emacs, надрукувавши: $ emacs midsummer
  2. Введіть наступне: Mx isearch-forward-regexp.

    Послідовність Mx - це умовний знак Emacs для Meta-x, який ви можете ввести в більшості систем або натиснувши і утримуючи клавіші Alt, одночасно натиснувши X, а потім відпустивши обидві клавіші, або натиснувши клавішу Esc, відпустивши її, і потім натиснувши клавішу X.

  3. Створіть регулярний вираз типу: t [az]

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

    Результати вашої роботи з Emacs повинні виглядати приблизно так, як на малюнку 3 .

    Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  4. Введіть Cx Cc щоб вийти з Emacs.

    Ви вводите цю комбінацію шляхом натискання і утримування клавіші Ctrl і одноразового натискання X, повторного натискання і утримування Ctrl з одночасним натисканням клавіші C.

Функцій isearch-forward-regexp і isearch-backward-regexp зазвичай соотвествуют комбінації MSs і MSr. (Щоб створити їх, натисніть і утримуйте Alt, Ctrl і або клавішу S або клавішу R.)

Відображення лише збігів, а не рядків цілком

Є інший підхід до проблеми контексту зразка, який складається тільки в тому, щоб виводити тільки збіги самі по собі, а не рядки, де було знайдено це збіг, цілком. Існує кілька способів щоб зробити це за допомогою grep, sed, і perl.

Відображення лише збігів за допомогою grep

Прапор --only-matching (або по-іншому -o) змінює поведінку grep так, що команда висновок не цілком рядки, в яких знайшлися збіги з шаблоном регулярного виразу, а тільки самі збіги. Разом з прапором --color, описаним вище , Ця можливість з'явилася в новітніх реалізаціях деяких версій grep, включаючи GNU grep, у якого відкритий вихідний код і який доступний для багатьох операційних систем.

Отже, цей прапор призначений для збору даних, які задовольняють умові в регулярному виразі, тому він ідеально підходить для збору IP-адрес, URL-посилань, імен, адрес електронної пошти, і т.п., але крім усього іншого це ще й відмінний спосіб отримати регулярні вирази. наприклад, приклад 4 показує як використовувати цей прапор, щоб отримати всі слова з досліджуваного тексту з прикладу 1 . Він виводить кожне слово в окремий рядок.

Приклад 4. Збір всіх слів з тексту

$ Egrep -o '[A-Za-z] +' midsummer I know a bank where the wild thyme blows Where oxlips and the nodding violet grows Quite over canopied with luscious woodbine With sweet musk roses and with eglantine $

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

Припустимо, потрібно вивести всі слова з текстового файлу, що містять рядок th, і ви створили регулярний вираз для реалізації цього, як показано в прикладі 5 .

Приклад 5. Висновок всіх слів, що містять th. Перша спроба

$ Egrep -o 'th [az] *' midsummer the thyme the th th th $

Регулярний вираз не працює. Видно, що деякі з результатів, виведених регулярним виразом, взагалі не є словами. Краще спробуйте заново: приклад 6 враховує також будь-які символи в словах, які можуть передувати th.

Приклад 6. Виводимо всі слова з th. друга спроба

$ Egrep -o '[az] * th [az] *' midsummer the thyme the with ith with $

Вже набагато краще, але поки ще не ідеальний результат. Рядок th говорить про те, що регулярний вираз не сприймає великі букви, коли шукає збіги зі своїм зразком. Виправте це за допомогою прапора -i, як показано в прикладі 7 .

Приклад 7. Висновок всіх слів, що містять th. третя спроба

$ Egrep -o -i '[az] * th [az] *' midsummer the thyme the with With with

Тепер те, що треба!

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

Відображення лише збігів з використанням sed

Ви можете робити речі, як в попередньому пункті, вже з використанням команди sed:

s /.* \ (regexp \). * / \ 1 / p

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

Приклад 8. Висновок тільки збіглися символів за допомогою sed

$ Sed -n 's /.* \ (th [az] \). * / \ 1 / p' midsummer thy the $ grep -o th [az] midsummer the thy the $

Відображення лише збігів з Perl

Регулярні вирази також активно використовуються в мові програмування Perl, але регулярні вирази в Perl відмінні від тих, що ви будували за допомогою команди grep. Інструментальне засіб pcretest дозволяє протестувати регулярні вирази в Perl. Можна використовувати цей інструментарій, щоб ознайомиться з Perl-сумісної бібліотекою регулярних виразів (PCRE), і для того, щоб налагодити або протестувати регулярні вирази, які були створені за допомогою цього інструментального засобу.

Зазвичай регулярний вираз полягає в символи-Слеш (/) і супроводжується модифікаторами, які вносять зміни в механізм пошуку. Найбільш поширені модифікатори регулярних виразів представлені в таблиці 1 .

Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest

Модифікатор Опис 8 Цей модифікатор додає підтримку символів Unicode (UTF-8). g Цей модифікатор шукає глобальні збіги (більше ніж по одному на рядок). i Цей модифікатор дозволяє ігнорувати регістр символів. m Цей модифікатор дає можливість пошуку на декількох рядках. x Цей модифікатор використовує розширені регулярні вирази Perl.

Спробуйте запустити pcretest, як показано на малюнку 9 .

Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest

$ Pcretest PCRE version 6.7 04-Jul-2006 re> / [az] * th [az] * / ig data> With sweet musk-roses and with eglantine. 0: With 0: with data> $

Також можна запустити pcretest з вхідним файлом, який містить регулярний вираз, яке треба протестувати на одній тільки рядку або сукупності рядків. У вас можуть бути складові регулярні вирази і зразки для порівнювання, тоді вони повинні бути відокремлені один від одного порожнім рядком. pcretest продовжує шукати збіги для зразка регулярного виразу у вхідних даних до тих пір, поки він не досягне кінця файлу (EOF).

Якщо ви надасте pcretest ім'я другого файлу, то він буде виводити результати в нього. В іншому випадку він здійснює стандартний висновок, як показано в прикладі 10 .

Приклад 10. Запуск pcretest з вхідним файлом

$ Cat midsummer.pre / w [hi] | th / gi I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Pcretest midsummer.pre PCRE version 6.7 04-Jul-2006 / w [hi] | th / gi I know a bank where the wild thyme blows, 0: wh 0: th 0: wi 0: th Where oxlips and the nodding violet grows, 0: Wh 0: th Quite over-canopied with luscious woodbine, 0: wi 0: th With sweet musk-roses and with eglantine. 0: Wi 0: th 0: wi 0: th $

Використання майстра створення регулярних виразів

txt2regex є інтерактивним крос-платформних майстром для створення регулярних виразів для інтерпретатора Bash. Коли ви його запускаєте, він задає ряд питань про зразок, з яким потрібно шукати збіги і потім створює коректне регулярний вираз для будь-якого з двох дюжен різних додатків:

  • awk;
  • ed;
  • egrep;
  • emacs;
  • expect;
  • find;
  • gawk;
  • grep;
  • javascript;
  • lex;
  • lisp;
  • mawk;
  • mysql;
  • ooo;
  • perl;
  • php;
  • postgres;
  • procmail;
  • python;
  • sed;
  • tcl;
  • vbscript;
  • vi;
  • vim.

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

Створення регулярного виразу

Щоб створити регулярний вираз для одного або більше підтримуваних txt2regex додатків , Розділяйте імена цих додатків коми. І використовуйте цей список в якості аргументу до прапора --prog.

Почніть з спроби створення регулярного виразу як в розділі Виділені кольором збіги , Яке шукає збіги для символу Т, прямо за яким слідує буква в нижньому регістрі:

  1. Запустіть txt2regex і визначте регулярні вирази для grep, sed, і Emacs: $ txt2regex --prog grep, sed, emacs
  2. Ви хочете шукати збіги для букви Т в будь-якій частині рядка, а не тільки в її початку, тому введіть 2 для вибору умови "в будь-якій частині рядка".
  3. Введіть 2 знову виберіть пункт "конкретний символ" і потім введіть t, коли будуть запитано, для якого саме символу шукати збіги.

    Тепер вам слід відповісти на питання скільки збігів вам треба знайти.

  4. Введіть 1, щоб точно визначити максимум збігів, які треба знайти.
  5. Для зіставлення букв нижнього регістру, введіть 6 щоб вибрати "особливу комбінацію символів" і потім введіть b для зіставлення букв нижнього регістру. Введіть. для виходу в головне меню txt2regex.
  6. Для зіставлення букв нижнього регістру тільки один раз введіть 1.

Після того як ви повністю визначте, яке регулярне вираз вам потрібно, txt2regex створить регулярний вираз для кожного з трьох обраних додатків і відобразить їх у верхній частині екрану. Отже, після того як ви точно визначилися з бажаною функціональністю регулярного виразу, можна побачити його в версіях для всіх трьох додатків на малюнку 4 .

Малюнок 4. Створення регулярного виразу за допомогою txt2regex

Введіть .. для виходу. Список регулярних виразів залишиться на вашому терміналі.

Так, вийшло так, що всі три регулярних вирази однакові t [az], але це тільки тому, що у нас досить просте регулярний вираз і три обрані додатки мають єдиний синтаксис для регулярних виразів. І далеко не завжди регулярні вирази будуть однакові для всіх трьох обраних додатків.

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

  1. Запустіть txt2regex без будь-яких прапорів: $ txt2regex
  2. Введіть 2 для пошуку збігів в будь-якій частині рядка.
  3. Введіть 6 щоб задати спеціальну комбінацію і потім введіть a і b для вибору всіх букв вернего або нижнього регістру.
  4. Введіть. для повернення в головне меню а потім введіть 4 щоб визначити, що потрібно шукати одне або більше збігів.

Без прапорів, тобто за замовчуванням, txt2regex створить регулярні вирази для наступних додатків і мов: perl, php, postgres, python, sed, and vim. Коли ви пройдете всі етапи, описані вище, при створенні регулярного виразу, виявиться, що перші чотири додатки використовують ті ж регулярні вирази, що були використані з grep в прикладі 4 , Але регулярні вирази для sed і vim відрізняються один від одного незначно. Це тому, що ці додатки використовують дещо різні набори метасимволов, як буде описано нижче .

І знову введіть .. для виходу з програми; регулярні вирази для різних програм залишаться на вашому терміналі. Ви можете використовувати їх такими або покращувати їх далі. Наприклад, як щодо пошуку збігів для слів, що містять символ апострофа ( ') & # 151; do not, who're, e'er, owner's, 'cause, Joe's і тому подібних? Регулярний вираз, яке ви створили тільки що, не зможе коректно зіставляти такі слова (див. приклад 11 ).

Приклад 11. Неправильне зіставлення слів з апострофом

$ Echo "Do not miss a word, just 'cause it's wrong." | egrep [A-Za-z] + Don t miss a word just cause it s wrong $

Вам треба додати символ апострофа до списку в квадратних дужках. Результат роботи регулярного виразу показаний в прикладі 12 . Зверніть увагу, що зараз регулярний вираз укладено в лапки.

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

Основні технології створення і використання регулярних виразів на UNIX-системах

Концепція регулярних виразів (regexps) - позначень для опису шаблонів, відповідних набору рядків - є спільною для безлічі програм і мов програмування. Різні реалізації регулярних виразів відрізняються один від одного в деталях, але принципи, необхідні для навчання створенню регулярних виразів, однакові у всіх їх реалізаціях.

Ця стаття розглядає кілька корисних інструментальних засобів і прийомів для навчання створенню і поліпшенню регулярних виразів для ряду додатків UNIX®, таких як:

Маркування збігів в залежності від їх контексту

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

Приклад 1. Текст з чотирьох рядків і регулярний вираз, яке шукає в них збігу

$ Cat midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Grep t [az] midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $

Так як регулярний вираз знаходить принаймні один збіг із зразком в кожному рядку, команда grep записує кожну строчку у вхідний файл. Але для яких саме символів з рядків знайдено збіг з регулярним виразом?

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

Ви можете здійснити це за допомогою декількох додатків, включаючи grep, sed і Emacs.

Маркування за допомогою grep

Деякі з новітніх версій grep (такі як GNU grep ) Відзначають кольором регулярний вираз, коли ви використовуєте опцію --color, як показано на малюнку 1 .

Малюнок 1. Виділені кольором збіглися підрядка в grep

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

Маркування за допомогою sed

Ви також можете маркувати регулярний вираз за допомогою потокового редактора sed. Команда sed:

'S / regexp / [&] / g'

Вона укладає в квадратні дужки всі збіги зі зразком, відмічені регулярним виразом. приклад 2 показує результати роботи sed на нескладному тексті.

Приклад 2. Збіги рядків, відмічені sed

$ Sed 's / t [az] / [&] / g' midsummer I know a bank where [th] e wild [th] yme blows, Where oxlips and [th] e nodding violet grows, Qui [te] over- canopied wi [th] luscious woodbine, Wi [th] sweet musk-roses and wi [th] eglan [ti] ne. $

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

$ Sed 's / t [az] / \\ fB & \\ fP / g' infile.roff | groff -

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

Приклад 3. sed-програма, яка виділяє кольором збіглися зі зразком рядки

#! / Bin / sh # highlights regexp pattern in input file # usage: hre regexp file sed 's /' $ 1 '/ ^ [[34m & ^ [[37m / g' <$ 2

Символ ^ [, який двічі з'являється в прикладі, є символом керуючої послідовності, тому вам треба вводити цей приклад в редакторі, який підтримує введення літеральних символів - наприклад Emacs (де для введення символу керуючої послідовності вам треба ввести Cq ESC). Числа 34 і 37 є кодами інтерпретатора Bash для завдання блакитного і та білого кольорів.

Щоб зробити скрипт виконуваним, надрукуйте:

$ Chmod 744 hre

Потім запустіть його, як показано на малюнку 2 .

Малюнок 2. Співпалі подстроки виділені кольором за допомогою sed

Хоча ви можете визначити колір виділення (маркування) тексту і прості кольори за допомогою цього методу, існують застереження до його використання. Наприклад, скрипт, показаний в прикладі 3 , Працює тільки тоді, коли простий текст у вікні терміналу білого кольору, тому що він відновлює цей колір тексту. Якщо ваш термінал використовує інший колір для відображення простого тексту, поміняйте в скрипті керуючий код. (Наприклад, 30 - це чорний.)

Виділення кольором за допомогою Emacs

У новітніх версіях редактора Emacs функції isearch-forward-regexp і isearch-backward-regexp виділяють всі збіги в буфері. Якщо у вас стоїть остання версія Emacs, спробуйте виконати ці функції зараз:

  1. Запустіть Emacs, надрукувавши: $ emacs midsummer
  2. Введіть наступне: Mx isearch-forward-regexp.

    Послідовність Mx - це умовний знак Emacs для Meta-x, який ви можете ввести в більшості систем або натиснувши і утримуючи клавіші Alt, одночасно натиснувши X, а потім відпустивши обидві клавіші, або натиснувши клавішу Esc, відпустивши її, і потім натиснувши клавішу X.

  3. Створіть регулярний вираз типу: t [az]

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

    Результати вашої роботи з Emacs повинні виглядати приблизно так, як на малюнку 3 .

    Малюнок 3. Буфер Emacs показує регулярний вираз для поточного завдання
  4. Введіть Cx Cc щоб вийти з Emacs.

    Ви вводите цю комбінацію шляхом натискання і утримування клавіші Ctrl і одноразового натискання X, повторного натискання і утримування Ctrl з одночасним натисканням клавіші C.

Функцій isearch-forward-regexp і isearch-backward-regexp зазвичай соотвествуют комбінації MSs і MSr. (Щоб створити їх, натисніть і утримуйте Alt, Ctrl і або клавішу S або клавішу R.)

Відображення лише збігів, а не рядків цілком

Є інший підхід до проблеми контексту зразка, який складається тільки в тому, щоб виводити тільки збіги самі по собі, а не рядки, де було знайдено це збіг, цілком. Існує кілька способів щоб зробити це за допомогою grep, sed, і perl.

Відображення лише збігів за допомогою grep

Прапор --only-matching (або по-іншому -o) змінює поведінку grep так, що команда висновок не цілком рядки, в яких знайшлися збіги з шаблоном регулярного виразу, а тільки самі збіги. Разом з прапором --color, описаним вище , Ця можливість з'явилася в новітніх реалізаціях деяких версій grep, включаючи GNU grep, у якого відкритий вихідний код і який доступний для багатьох операційних систем.

Отже, цей прапор призначений для збору даних, які задовольняють умові в регулярному виразі, тому він ідеально підходить для збору IP-адрес, URL-посилань, імен, адрес електронної пошти, і т.п., але крім усього іншого це ще й відмінний спосіб отримати регулярні вирази. наприклад, приклад 4 показує як використовувати цей прапор, щоб отримати всі слова з досліджуваного тексту з прикладу 1 . Він виводить кожне слово в окремий рядок.

Приклад 4. Збір всіх слів з тексту

$ Egrep -o '[A-Za-z] +' midsummer I know a bank where the wild thyme blows Where oxlips and the nodding violet grows Quite over canopied with luscious woodbine With sweet musk roses and with eglantine $

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

Припустимо, потрібно вивести всі слова з текстового файлу, що містять рядок th, і ви створили регулярний вираз для реалізації цього, як показано в прикладі 5 .

Приклад 5. Висновок всіх слів, що містять th. Перша спроба

$ Egrep -o 'th [az] *' midsummer the thyme the th th th $

Регулярний вираз не працює. Видно, що деякі з результатів, виведених регулярним виразом, взагалі не є словами. Краще спробуйте заново: приклад 6 враховує також будь-які символи в словах, які можуть передувати th.

Приклад 6. Виводимо всі слова з th. друга спроба

$ Egrep -o '[az] * th [az] *' midsummer the thyme the with ith with $

Вже набагато краще, але поки ще не ідеальний результат. Рядок th говорить про те, що регулярний вираз не сприймає великі букви, коли шукає збіги зі своїм зразком. Виправте це за допомогою прапора -i, як показано в прикладі 7 .

Приклад 7. Висновок всіх слів, що містять th. третя спроба

$ Egrep -o -i '[az] * th [az] *' midsummer the thyme the with With with

Тепер те, що треба!

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

Відображення лише збігів з використанням sed

Ви можете робити речі, як в попередньому пункті, вже з використанням команди sed:

s /.* \ (regexp \). * / \ 1 / p

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

Приклад 8. Висновок тільки збіглися символів за допомогою sed

$ Sed -n 's /.* \ (th [az] \). * / \ 1 / p' midsummer thy the $ grep -o th [az] midsummer the thy the $

Відображення лише збігів з Perl

Регулярні вирази також активно використовуються в мові програмування Perl, але регулярні вирази в Perl відмінні від тих, що ви будували за допомогою команди grep. Інструментальне засіб pcretest дозволяє протестувати регулярні вирази в Perl. Можна використовувати цей інструментарій, щоб ознайомиться з Perl-сумісної бібліотекою регулярних виразів (PCRE), і для того, щоб налагодити або протестувати регулярні вирази, які були створені за допомогою цього інструментального засобу.

Зазвичай регулярний вираз полягає в символи-Слеш (/) і супроводжується модифікаторами, які вносять зміни в механізм пошуку. Найбільш поширені модифікатори регулярних виразів представлені в таблиці 1 .

Таблиця 1. распространненость модифікатори регулярних виразів для інструментального кошти pcretest

Модифікатор Опис 8 Цей модифікатор додає підтримку символів Unicode (UTF-8). g Цей модифікатор шукає глобальні збіги (більше ніж по одному на рядок). i Цей модифікатор дозволяє ігнорувати регістр символів. m Цей модифікатор дає можливість пошуку на декількох рядках. x Цей модифікатор використовує розширені регулярні вирази Perl.

Спробуйте запустити pcretest, як показано на малюнку 9 .

Малюнок 9. Тестування ваших регулярних виразів за допомогою pcretest

$ Pcretest PCRE version 6.7 04-Jul-2006 re> / [az] * th [az] * / ig data> With sweet musk-roses and with eglantine. 0: With 0: with data> $

Також можна запустити pcretest з вхідним файлом, який містить регулярний вираз, яке треба протестувати на одній тільки рядку або сукупності рядків. У вас можуть бути складові регулярні вирази і зразки для порівнювання, тоді вони повинні бути відокремлені один від одного порожнім рядком. pcretest продовжує шукати збіги для зразка регулярного виразу у вхідних даних до тих пір, поки він не досягне кінця файлу (EOF).

Якщо ви надасте pcretest ім'я другого файлу, то він буде виводити результати в нього. В іншому випадку він здійснює стандартний висновок, як показано в прикладі 10 .

Приклад 10. Запуск pcretest з вхідним файлом

$ Cat midsummer.pre / w [hi] | th / gi I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ Pcretest midsummer.pre PCRE version 6.7 04-Jul-2006 / w [hi] | th / gi I know a bank where the wild thyme blows, 0: wh 0: th 0: wi 0: th Where oxlips and the nodding violet grows, 0: Wh 0: th Quite over-canopied with luscious woodbine, 0: wi 0: th With sweet musk-roses and with eglantine. 0: Wi 0: th 0: wi 0: th $

Використання майстра створення регулярних виразів

txt2regex є інтерактивним крос-платформних майстром для створення регулярних виразів для інтерпретатора Bash. Коли ви його запускаєте, він задає ряд питань про зразок, з яким потрібно шукати збіги і потім створює коректне регулярний вираз для будь-якого з двох дюжен різних додатків:

  • awk;
  • ed;
  • egrep;
  • emacs;
  • expect;
  • find;
  • gawk;
  • grep;
  • javascript;
  • lex;
  • lisp;
  • mawk;
  • mysql;
  • ooo;
  • perl;
  • php;
  • postgres;
  • procmail;
  • python;
  • sed;
  • tcl;
  • vbscript;
  • vi;
  • vim.

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

Створення регулярного виразу

Щоб створити регулярний вираз для одного або більше підтримуваних txt2regex додатків , Розділяйте імена цих додатків коми. І використовуйте цей список в якості аргументу до прапора --prog.

Почніть з спроби створення регулярного виразу як в розділі Виділені кольором збіги , Яке шукає збіги для символу Т, прямо за яким слідує буква в нижньому регістрі:

  1. Запустіть txt2regex і визначте регулярні вирази для grep, sed, і Emacs: $ txt2regex --prog grep, sed, emacs
  2. Ви хочете шукати збіги для букви Т в будь-якій частині рядка, а не тільки в її початку, тому введіть 2 для вибору умови "в будь-якій частині рядка".
  3. Введіть 2 знову виберіть пункт "конкретний символ" і потім введіть t, коли будуть запитано, для якого саме символу шукати збіги.

    Тепер вам слід відповісти на питання скільки збігів вам треба знайти.

  4. Введіть 1, щоб точно визначити максимум збігів, які треба знайти.
  5. Для зіставлення букв нижнього регістру, введіть 6 щоб вибрати "особливу комбінацію символів" і потім введіть b для зіставлення букв нижнього регістру. Введіть. для виходу в головне меню txt2regex.
  6. Для зіставлення букв нижнього регістру тільки один раз введіть 1.

Після того як ви повністю визначте, яке регулярне вираз вам потрібно, txt2regex створить регулярний вираз для кожного з трьох обраних додатків і відобразить їх у верхній частині екрану. Отже, після того як ви точно визначилися з бажаною функціональністю регулярного виразу, можна побачити його в версіях для всіх трьох додатків на малюнку 4 .

Малюнок 4. Створення регулярного виразу за допомогою txt2regex

Введіть .. для виходу. Список регулярних виразів залишиться на вашому терміналі.

Так, вийшло так, що всі три регулярних вирази однакові t [az], але це тільки тому, що у нас досить просте регулярний вираз і три обрані додатки мають єдиний синтаксис для регулярних виразів. І далеко не завжди регулярні вирази будуть однакові для всіх трьох обраних додатків.

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

  1. Запустіть txt2regex без будь-яких прапорів: $ txt2regex
  2. Введіть 2 для пошуку збігів в будь-якій частині рядка.
  3. Введіть 6 щоб задати спеціальну комбінацію і потім введіть a і b для вибору всіх букв вернего або нижнього регістру.
  4. Введіть. для повернення в головне меню а потім введіть 4 щоб визначити, що потрібно шукати одне або більше збігів.

Без прапорів, тобто за замовчуванням, txt2regex створить регулярні вирази для наступних додатків і мов: perl, php, postgres, python, sed, and vim. Коли ви пройдете всі етапи, описані вище, при створенні регулярного виразу, виявиться, що перші чотири додатки використовують ті ж регулярні вирази, що були використані з grep в прикладі 4 , Але регулярні вирази для sed і vim відрізняються один від одного незначно. Це тому, що ці додатки використовують дещо різні набори метасимволов, як буде описано нижче .

І знову введіть .. для виходу з програми; регулярні вирази для різних програм залишаться на вашому терміналі. Ви можете використовувати їх такими або покращувати їх далі. Наприклад, як щодо пошуку збігів для слів, що містять символ апострофа ( ') & # 151; do not, who're, e'er, owner's, 'cause, Joe's і тому подібних? Регулярний вираз, яке ви створили тільки що, не зможе коректно зіставляти такі слова (див. приклад 11 ).

Приклад 11. Неправильне зіставлення слів з апострофом

$ Echo "Do not miss a word, just 'cause it's wrong." | egrep [A-Za-z] + Don t miss a word just cause it s wrong $

Вам треба додати символ апострофа до списку в квадратних дужках. Результат роботи регулярного виразу показаний в прикладі 12 . Зверніть увагу, що зараз регулярний вираз укладено в лапки.

Приклад 12. Правильне зіставлення слів з апострофом

$ Echo "Do not miss a word, just 'cause it's wrong." | egrep "[A-Za-z '] +" Do not miss a word just' cause it's wrong $

Наступне регулярний вираз, котороерассматрівалось в розділі Як показати тільки самі збіги, а не рядок цілком було для одиночних слів, що містять в будь-якій своїй частині поєднання символів th. Ви використовували регулярні вирази для egrep, sed, і perl; тепер спробуємо створити його для grep:

  1. Запустіть txt2regex: $ txt2regex
  2. Введіть / для вибору доступних програм і введіть hkopqstx .. Таким чином буде створено регулярний вираз тільки для grep.
  3. Введіть 26ab.3 для можливості пошуку потрібного поєднання букв верхнього або нижнього регістру де завгодно в рядку.
  4. Введіть 2t12h1 для завдання символів, яким шукати збіги - T і H, наступними один за одним, причому це поєднання, TH, зустрічається тільки один раз в слові.
  5. Введіть 6ab.3 для можливості пошуку послідовності букв th; будь-якого регістра.
  6. Введіть ..для виходу з програми.

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

Приклад 13. Зіставлення слів, що містять th за допомогою grep

$ Grep -o [A-Za-z] * th [A-Za-z] * midsummer the thyme the with With with $

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

Опція (прапор) --showinfo виводить коротке зведення інформації про створення регулярних виразів конкретно для будь-якої мови або програми. У виведену інформацію включається назва і версія додатка, метасимволу регулярного виразу, символ за замовчуванням зазначеного подвираженія ( "\"), яке може бути використано пізніше, метасимволу, перед якими треба ставити "\", чи можете ви використовувати в квадратних дужках символ табуляції ( "\ t") і підтримує мову або додаток вираження, що укладаються в квадратні дужки, певні в Portable Operating System Interface (POSIX).

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

Приклад 14. Одержання короткого огляду правил регулярних виразів за допомогою txt2regex

$ Txt2regex --showinfo javascript program javascript: netscape-4.77 metas. [] [^] * +? {} | () Esc meta \ need esc \. * [{(| +? ^ $ \ T in [] YES [: POSIX:] NO $ txt2regex --showinfo php program php: 4.0.6 metas. [] [^] * +? {} | () esc meta \ need esc \. * [{(| +? ^ $ \ t in [] YES [: POSIX:] YES $

Отримання готових регулярних виразів

Опція --make описана своїм автором як a remedy for headaches (ліки від головного болю). Воно виводить регулярні вирази для одного з декількох загальних зразків, які задаються як параметри. Список готових регулярних виразів показаний в табліці 2 .

Таблиця 2. Список готових регулярних виразів, що надаються txt2regex

Аргумент Опис date Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/0000 до 99/99/9999. date2 Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/1000 до 19/39/2999. date3 Цей параметр відповідає даті в форматі mm / dd / yyyy з діапазоном від 00/00/1000 до 12/31/2999. hour Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 99:99. hour2 Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 29:59. hour3 Цей параметр відповідає часу в форматі hh: mm в діапазоні від 00:00 до 23:59. number Цей парамеір відповідає будь-якому позитивному чи негативному целочисленному значенням. number2 Цей параметр відповідає будь-якому позитивному чи негативному цілому числу з додатковими розрядами після коми. number3 Цей параметр відповідає позитивному або негативному цілому числу з додатковими запитом і додатковим значенням після коми.

Наприклад, ви можете використовувати ці параметри щоб отримати свої формальні вирази для роботи з військовим часом, як показано в прикладі 15 .

Приклад 15. Отримання регулярного виразу для роботи з часом від txt2regex

$ Txt2regex --make hour3 RegEx perl: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx php: ([01] [0-9] | 2 [0123] ): [012345] [0-9] RegEx postgres: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx python: ([01] [0-9] | 2 [0123]): [012345] [0-9] RegEx sed: \ ([01] [0-9] \ | 2 [0123] \): [012345] [0-9] RegEx vim: \ ([ 01] [0-9] \ | 2 [0123] \): [012345] [0-9] $

список метасимволов

Іншою корисною можливістю txt2regex є опція --showmeta, яка виводить таблицю, яка містить всі метасимволу, використовувані при побудові регулярних виразів для програм, які підтримуються і мов. Робота цієї опції показана в прикладі 16 .

Приклад 16. Відображення всіх метасимволов за допомогою txt2regex

$ Txt2regex --showmeta awk +? | () Ed \ + \? \ {\} \ | \ (\) Egrep +? {} | () Emacs +? \ | \ (\) Expect +? | () Find +? \ | \ (\) Gawk +? {} | () Grep \ + \? \ {\} \ | \ (\) Javascript +? {} | () Lex +? {} | () Lisp +? \\ | \\ (\\) mawk +? | () Mysql +? {} | () Ooo +? {} | () Perl +? {} | () Php +? {} | () Postgres +? {} | () Procmail +? | () Python +? {} | () Sed \ + \? \ {\} \ | \ (\) Tcl +? | () Vbscript +? {} | () Vi \ {1 \} \ {01 \} \ {\} \ (\) vim \ + \ = \ {} \ | \ (\) NOTE:. [] [^] And * are the same on all programs. $

вивчення документів

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

Наприклад, синтаксис створення регулярних виразів до grep, sed і інших інструментальних засобів подібного типу, а також приклади до цих регулярними виразами описані в справоной системі man. Якщо у вас встановлені GNU-версії цих додатків, то у них також повинні бути довідкові системи, що містять навіть більше інформації, ніж стандартна довідкова система man. Наприклад, якщо у вас встановлений GNU sed і у вас є файл довідки info, ви можете прочитати керівництво:

$ Info sed

Документація до Perl (зазвичай посталяется окремо від основного комплекту поставки Perl) містить всебічну оперативну сторінку керівництва за регулярними виразами в Perl:

$ Man perlre

І навіть більше! Оперативна сторінка керівництва man для pcrepattern (поставляється з пріложеніемpcretest, як описано вище ) Також є посібником з регулярними виразами в Perl.

На закінчення, оперативна сторінка керівництва man по regex, доступна на багатьох UNIX-системах, надає інформацію про створення регулярних виразів, що підтримують інтерфейси POSIX. Інформація в цій оперативної сторінці пам'яті взята з бібліотеки регулярних виразів Генрі Спенсера (Henry Spencer's regex library) (див. додаткову інформацію ).

Висновок

Безліч інструментальних засобів і методів доступні на UNIX-системах для створення регулярних виразів. Ви ознайомилися з кращими з них.

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

Ресурси для скачування

Схожі тими

  • Know your regular expressions : Ознайомтеся з оригіналом статті (EN).
  • " Hone your regexp pattern-building skills "(Michael Stutz, developerWorks, липень 2006): ця стаття описує кілька регулярних виразів для системного адміністрування, які ви, можливо, знайдете корисними для себе.
  • Speaking UNIX, Part 9: Regular expressions (EN) (Martin Streicher, developerWorks, квітень 2007 року): ця стаття являє собою короткий підручник для початківців створювати регулярні вирази.
  • Ознайомтеся з іншими статтями, написаними Міхаелем Штутцом (Michael Stutz):
  • Розділи бібліотеки інформації по AIX і UNIX: (EN)
  • Podcasts : Залишайтеся на зв'язку з технічними експертами IBM. (EN)
  • GNU Project Web site : Завантажте безкоштовну копію GNU grep для вашої операційної системи. (EN)
  • PCRE : Завантажте безкоштовну копію PCRE. (EN)
  • txt2regex script : Завантажте безкоштовну копію програми txt2regex. (EN)
  • regex : Завантажте безкоштовну копію бібліотек регулярних виразів Генрі Спенсера (Henry Spencer's regular expression libraries). (EN)

Підпішіть мене на ПОВІДОМЛЕННЯ до коментарів

Ed \ + \?
Egrep +?
Emacs +?
Expect +?
Find +?
Gawk +?
Grep \ + \?
Javascript +?
Lex +?
Lisp +?

Новости