Один довільний символ

екзотичні слова, в яких за буквою q слід який-небудь ін ший символ - в перекладі на мову регулярних виразів це виглядає як q [^ u]. Я застосував цей вислів до свого списку слів. Як і сле дова очікувати, таких слів виявилося трохи! Більш того, про істота вання деяких із знайдених слів я взагалі не підозрював.

Ось як це виглядало:

% Egrep 'q [^ u]' word.list

Пам'ятайте: інвертований символьний клас означає «збіг з символами, що не входять в список», а не «розбіжність з символу ми, що входять в список». На перший погляд здається, що це одне і те ж, проте приклад зі словом Iraq демонструє відмінності між цими двома трактуваннями. Інвертований клас зручно розглядає вать як скорочену форму запису для звичайного класу, включаю ного всі можливі символи, крім перерахованих.

Метасимвол. (Точка) являє собою скорочену форму запису для символьного класу, що збігається з будь-яким символом. Він примі няется в тих випадках, коли в деяких позиціях регулярного Вира вання можуть перебувати довільні символи. Припустимо, треба най ти дату, яка може бути записана в форматі 19/03/76, 19 03 76 або навіть 19.03.76. Звичайно, можна сконструювати регулярне висловлю ня, в якому між числами вказуються всі допустимі символи роздільники ( '/', '' і '.'), Наприклад 19 [./] 03 [./]76. Однак возмо дружин і інший варіант - просто ввести вираз 19.03.76.

У наведеному прикладі є ряд неочевидних аспектів. У висловлю ванні 19 [./] 03 [./]76 точки не є метасимвол, оскільки вони знаходяться всередині символьного класу (не забувайте: склад і ін інтерпретації метасимволов розрізняються всередині класу і за його преде лами). Дефіси в даному випадку теж інтерпретуються як літерали, оскільки вони йдуть відразу ж після [і [^. Якби дефіси не стояли на перших місцях (наприклад, [. /]), Вони інтерпретувалися б як інтервальні метасимволу, що в даному випадку привело б до помилки.

Один довільний символ

36 Глава 1. Знайомство з регулярними виразами

У вираженні 19.03.76 точки є метасимвол, совпадающі ми з будь-яким символом, в тому числі і з очікуваними нами '/', '' і '.'. Проте необхідно враховувати, що кожна точка може Совпа дати з абсолютно будь-яким символом, тому збіг виявляючи ється, наприклад, в рядку 'lottery numbers: 19 2 19303 76 39'.

Відповідь на питання з стр. 35.

Чому q [^ u] не збігається зі словами 'Qantas' або 'Iraq'?

Qantas не збігається, оскільки в регулярному виразі вказано символ q в нижньому регістрі, а в слові «Qantas» він відноситься до верхнього регістру. Якщо використовувати вираз Q [^ u]. бу дет знайдено це слово, але зате пропущені всі інші. Вира ються [Qq] [^ u] виявило б все слова.

У прикладі зі словом Iraq криється підступ. У регулярному висловлю ванні вказано символ q, за яким слід символ. відмінний від u, що цілком може відповідати символу перекладу рядка. Перевіряється текст зазвичай завершується символом переведення рядка, але оскільки перед перевіркою egrep видаляє ці симво ли (ах, вибачте, я зовсім забув згадати про це!), Після q немає взагалі ніяких даних. Там немає ніякого символу, відмінного від u, який можна було б прийняти за збіг.

Не засмучуйтеся через те, що питання виявився несподівано складність ним. 1 Запевняю вас: якби програма egrep не видаляти символи розриву рядків (як це роблять деякі інші програми) або якби за словом Iraq слідували прогалини, інші слова або ще що-небудь, рядок була б успішно виявлена. Обхідно добре розбиратися в тонкощах роботи кожної програм ми, але поки з цього прикладу необхідно винести одне: сім (вільному класу, навіть інвертовану, в тексті обязатель (але повинен відповідати який (небудь символ.

1 Одного разу в четвертому класі на уроці орфографії мені було поставлено під прос, як пишеться слово «miss». Я відповів: «m · i · s · s». Міс Сміт з насолодою сказала, що це неправильно, а правильно буде: «M · i · s · s» - з великої літери M і що спочатку я повинен був попро сить приклад пропозиції. Це був сильний удар по дитячій психи ке. Після цього випадку я не злюбив міс Сміт і почав ставитися до її предмету з прохолодою.

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

Одне з декількох подвираженій

Дуже зручний метасимвол | означає «або». Він дозволяє об'єд нитку кілька регулярних виразів в одне, що збігається з будь-яким з виразів компонентів. Наприклад, Bob та Robert - два різних виразу, a Bob | Robert - один вислів, що збігається з будь-якою з цих рядків. Подвираженія, об'єднані цим способом, називають ся альтернативами (alternatives).

Повернемося до прикладу gr [ea] y. Цікава подробиця: вираз також можна записати в вигляді grey | gray і навіть gr (a | e) y. В останньому варіанті круглі дужки відділяють конструкцію вибору від остально го вираження (і, до речі кажучи, теж є метасимвол). Кон ція виду gr [a | e] y нам не підійде - в символьному класі сім віл '|' є звичайним символом, як a або e.

У вираженні gr (a | e) y круглі дужки обов'язкові, оскільки без них gra | ey буде означати «gra або ey» - зовсім не те, що нам нуж але. Конструкція вибору діє тільки всередині круглих дужок.

У наступному прикладі ми розглянемо кілька варіантів написа ня мого імені. Порівняйте наступні три вирази, які озна чають фактично одне і те ж:

Щоб вираження також враховували варіант написання, прийнятий у Великобританії, вони приймають такий вигляд:

1 Нагадаю, що символ '•' використовується для позначення пропуску.

Глава 1. Знайомство з регулярними виразами

Слід зауважити, що ці три варіанти еквівалентні довшою (але більш зрозумілою) записи Jeffrey | Geoffery | Jeffery | Geoffrey. Все це різні способи для визначення одних і тих же умов збігу.

Втім, порівняння gr [ea] y з gr (a | e) y злегка відволікло нас від основної теми. Будьте уважні і не плутайте конструкцію вибору з цим вільними класами. Символьний клас представляє один символ це лівого тексту. У конструкціях вибору кожна альтернатива може яв ляться повноцінним регулярним виразом, що збігається з вироб вільним кількістю символів. Символьні класи, можна вважати, володіють власним міні мовою (і, зокрема, власними уявленнями про метасимвол), тоді як конструкція вибору яв ляется частиною «основного» мови регулярних виразів. Як ви зможете переконатися, обидві конструкції надзвичайно корисні.

Крім того, будьте уважні при використанні знаків ^ і $ в виразу з конструкціями вибору. Порівняйте два вирази:

^ From | Subject | Date: • і ^ (From | Subject | Date): •. Вони нагадують рас смотреніі вище приклад з електронною поштою, але мають різне значення (а значить, і різний ступінь корисності). Перший вираз зі варто з трьох простих альтернатив; воно означає «^ From. або Subject. або Date: • »і тому особливої ​​користі не приносить. Нам потрібно, щоб префікс ^ і суфікс. • ставилися до кожної з альтернатив. Для цього конструкція вибору «обмежується» дужках:

Дія вибору обмежується круглими дужками, тому приве денное вираз буквально означає: «початок рядка, потім одна з подстрок From. Subject або Date і потім. • ». Воно збігається в слідую щих трьох випадках:

1. Початок рядка, символи F · r · o · m, а потім ': •' або

2. Початок рядка, символи S · u · b · j · e · c · t, а потім ': •' або

3. Початок рядка, символи D · a · t · e, а потім ': •'.

Простіше кажучи, збіг відбувається в кожному рядку, яка почи нается або з 'From: •', або з 'Subject: •', або з 'Date: •', - саме те, що нам потрібно для отримання списку повідомлень з файлу електрон ної пошти.

% Egrep '^ (From

Subject: now, about your vote ...