Форум » Справочная » Регулярные выражения » Ответить

Регулярные выражения

Алексей: Доброе время суток! Не могу разобраться с регулярными выражениями. Если не сложно, напишите здесь примеры каких нибудь полезных регулярных выражений... Заранее благодарю!

Ответов - 57, стр: 1 2 3 All

KOMODOR: Думаю, рациональнее всего бы было перенести тему в справочный раздел, ибо тема действительно интересна и обширна. Как-то я, например, долго подбирал регулярку на поиск глав по цифрам, но так ничего путно и не получилось, плюнул, и переименова все главы из "1" в "глава 1"

Cminant: Пожалуй, теорию я тут расписывать не буду, этого добра при желании в интернете можно найти много. Начать стоит хотя бы со странички на википедии. Что касается практики, то приведу несколько примеров: чтоб далеко за примером не ходить, начнем с поиска глав =) пример (главы по цифрам с точкой или без точки): [pre2] 1. текст текст текст текст~ ~текст текст текст текст. 2. текст текст текст текст~ ~текст текст текст текст. 3. текст текст текст текст~ ~текст текст текст текст.[/pre2] шаблон: ^ *\d+\.?$ "^" - поиск начинается с начала строки " *" - пробелы в начале строки, если они есть "\d+" - одна или несколько цифр идущих подряд "\.?" - если после цифр есть точка, включаем и ее тоже "$" - конец строки пример (цифры с точкой + название главы): [pre2] 1. ДОЛГОЖДАННЫЙ ПРИЕМ текст текст текст текст~ ~текст текст текст текст. 2. ТЕНЬ ПРОШЛОГО текст текст текст текст~ ~текст текст текст текст. 3. ТРОЕ - ЭТО КОМПАНИЯ текст текст текст текст~ ~текст текст текст текст.[/pre2] шаблон: ^ *\d+\..*$ "^" - поиск начинается с начала строки " *" - пробелы в начале строки, если они есть "\d+" - одна или несколько цифр идущих подряд "\." - точка ".*" - что угодно (все символы сколько их есть до конца строки "$") "$" - конец строки Пример (пустая строка + название главы + пустая строка): [pre2] Глас рассудка I текст текст текст текст~ ~текст текст текст текст. Ведьмак текст текст текст текст~ ~текст текст текст текст. Глас рассудка II текст текст текст текст~ ~текст текст текст текст.[/pre2] Шаблон: \r\n\r\n.{1,50}\r\n\r\n "\r\n\r\n" - Cимволы перевода строки (CR LF). Два перевода подряд (CR LF CR LF) = пустая строка ".{1,50}" - Название главы (строка не более 50 любых символов) "\r\n\r\n" - Символы перевода строки (CR LF). Два перевода подряд (CR LF CR LF) = пустая строка т.е. шаблон ищет строку не более чем в 50 символов, отделенныю от остального текста пустой строкой сверху и снизу. Примечание: при поиске глав все найденные символы новой строки и пробелы по краям потом удаляются из тэга автоматически, так что можно не заморачиваться с дополнительными шаблонами поиска строк перед и после основного шаблона (вроде "(?<=\r\n\r\n).{1,50}(?=\r\n\r\n)" ) Что касается использования регулярных выражений в словарях, то см, например, тему про омографы... Для экспериментов можно использовать служебное окно отладки словарей в режиме "RegEx", открывающееся через редактор словарей:

MoppoH: Если нет много времени чтобы составить словарь можно начать с простейших выражений типа (?i)(?<=(ают|гие|дние|жие|кие|нние|рил|тал|хие|шие|шние|щие|ые).{0,5})\bсектора\b = сектора< (?i)(?<=(али|ать|ают|гие|гли|дние|дул|ены|жие|ись|ите|ить|кие|хие|шие|шние|щие|ые).{0,5})\bсвечи\b = све<чи и такие в окончания подходят для большинства омографов, но и такой простой поиск поможет избавиться от большинства ошибок при произношении того или иного слова, я на работе в течении дня слушая книгу записываю где он неправильно произносит, а вечером добавляю в словарь. пы.сы жаль нет поиска по тексту приходится искать в другой программе. вот словарь замены правда он еще не идеален click here


odinokiyklaus: MoppoH пишет: (?i)(?<=(али|ать|ают|гие|гли|дние|дул|ены|жие|ись|ите|ить|кие|хие|шие|шние|щие|ые).{0,5})\bсвечи\b = све<чи Всем привет. Уже всю голову сломал, не понимаю... Вот ваше мнение какое?? Вы думаете это выражение будет реально работать?? Ну вот сами посмотрите.. на это выражение вываливается ошибка - видимо шаблон али|ать|ают и т.д. нельзя брать в скобки, т.е. группировать... Единственный способ, который у меня получился - это выражение такого типа: (?<=али|шие|шние|щие|ые)\b.{0,30}свечи\b и для анализируемой строки догарали наши свечи решение будет вида догарали наши свечи, причем вместе с пробелом тут можно посмотреть результат. и далее, если рег. выражение будет такого типа (?<=али|шие|шние|щие|ые)\b.{0,30}свечи\b = све<чи, то мы благополучно заменим найденное выражение наши свечи на выражение све<чи и итогом будет не строка догарали наши све<чи, а строка догарали све<чи Может кто знает, решается ли вообще эта задача по поиску конкретного слова (свечи) в зависимости от предшествующего контекста (окончания определений для слова свечи)?

Cminant: odinokiyklaus пишет: Ну вот сами посмотрите.. на это выражение вываливается ошибка - видимо шаблон али|ать|ают и т.д. нельзя брать в скобки, т.е. группировать... Смотря где... Сущестуют различные реализации интерпретаторов регулярных выражений, и у каждой могут быть небольшие отличия и особенности. Онлайн сервис по вашей ссылке предназначен для тестирования выражений в среде языка Ruby. В нем, как и во многих других интерпретаторах регулярных выражений, поддержка look-behind ограниченная: результтат внутри (?<=...) всегда должен быть фиксированной длинны, а это значит, что "*", "+", "{x,y}" и прочие квантификаторы для неизвестного количества повторов, а так же варианты различной длинны, разделенные символом "|" недопустимы. В KooBAudio используется движок регулярных выражений, встроенный в .NET Framework. Он полностью поддерживает все возможности синтаксиса внутри look-behind групп, и такое выражение будет работать. Для проверки есть встроенная опция "Меню Словари->отладка словарей->RegEx" или кнопка с увеличительным стеклом в панели инструментов редакора словарей. В последней версии как раз она была усовершенствована для удобства работы с рег.выражениями в редакторе. Есть простой режим проверки рег выражений. В верхнем поле - выражение, в нижнем текст, в котором ищутся совпадения. В режиме проверки словарей все устроено вот как: в поле (3) можно ввести любой текст для проверки. в поле (4) - результат обработки текущими словарями. Если открыто окно редактора словарей, и в снем нажать кнопу "Сохранить", то этот результат автоматически обновится. В списке (5) будут показаны правила, которые выдали совпадения. Зачеркнутые - те, что ссылаются на "занятый" другим правилом фрагмент, и не влияют на результат. Если открыты одновременно окно редактора и отладки словарей, и в редакторе включена подсветка синтаксиса (2), то текст в поле (3) будет подсвечен редактируемым выражением.

Cminant: P.S. Свои словари выложу как-нибудь позже, все никак руки не дойдут окончательно рассортировать и привести их в порядок... Вот еще пара советов с примерами использования регэксов в словарях: Не обязательно всегда использовать .{0,x}. Если словосочетание более-менее конкретное, можно использовать конструкции типа ( \w+)? для возможного одного слова между ключевым словом и омографом... [pre2](?i)(?<=\b(?:дай|дать|дал|дала|дают|давал|давала|давали) (?: \w+)?)воды\b=воды<[/pre2] Кроме поиска вперед/назад в группах (?<=...) (?=...) можно так же иногда использовать обратную связь, чтобы вставить содержимое группы в результат замены, например: [pre2](?i)\bстоящ(ий|ая|ему|ей|его|юю|ем|ей|ими)(?= (рядом|неподалеку|около|возле|за|под|у)\b)=стоя<щ$1[/pre2]$1 будет заменен на результат группы 1 (ий|ая|ему|ей|его|юю|ем|ей|ими) [pre2](?i)\b(замк[ауиео])(х|м|ми|в)?\b(?=[^\r\n\.\?\!]{0,40}(?:откры|отпер|запер|взл[оа]м|вскры|висяч|навесн|ржав|амбарн|хитроумн|хлипк|щелкнул|ключ|двер))=$1<$2[/pre2]$1 вставит результат (замк[ауиео]) $2 - результат (х|м|ми|в)? Номера групп присваиваются автоматически, начиная с 1, слева направо. Группы, к которым не нужно потом обращаться рекомендуется обьявлять с ключем ?: (?:шаблон) - для таких групп обратная связь не создается, и они пропускаются при нумерации. Это так же немного ускорит обработку правила. При большом кол-ве правил со обилием группировок это может дать заметный прирост производительности. В сложных выражениях с обилием вложенных групп можно использовать именованные группы, чтобы не высчитывать номер нужной группы, а обратиться к ней по имени. [pre2](?i)\b(?<начало>замк[ауиео])(?<окончание>х|м|ми|в)?\b(?=[^\r\n\.\?\!]{0,40}(?:откры|отпер|запер|взл[оа]м|вскры|висяч|навесн|ржав|амбарн|хитроумн|хлипк|щелкнул|ключ|двер))=${начало}<${окончание}[/pre2] Использование обратных связей для омографов в правилах вида [pre2](?i)((али|ать|ают|гие|гли|дние|дул|ены|жие|ись|ите|ить|кие|хие|шие|шние|щие|ые).{0,30}))\bсвечи\b=$1све<чи[/pre2] Теоретически возможно, но НЕ рекомендуется. Т.к. правило зарезервирует весь соответствующий текст, и прочие правила не смогут его обработать. Например, правило догарали=>догара<ли Будет отсеяно в тексте "догарали наши свечи", т.к. слово уже зарезервировано правилом для омографа... В общем, для таких правил, лучше использовать поиск вперед/назад в (?<=...) (?=...) с ними резервируется только "нужное" слово, а окружающий текст может быть потом обработан другими правилами.

MoppoH: На самом деле там все достаточно просто 1 если ищешь только по окончанию то регулярное выражение выглядит примерно так: (?i)(?<=(а(ли|ть|ют)|(г|дн|ж|к|х|хн|ш|шн|щ)ие|дел|ены|жит|иеся|или|ить|кины|лил|лись|няли|рил|рыл|сал|тся|шую|ые|ыть)\b.{0,5})\bокна\b (г|дн|ж|к|х|хн|ш|шн|щ)ие это чтобы не писать отдельно гие|дние| и так далее \b это чтобы искало только в окончание, \b ставит границы слова .{0,5} количество символов перед этим словом \bокна\b так же с границами чтобы не искало слова окнами или корень окна в других словах 2 если ищет окончания после нужного слова (?i)\bвсе\b(?=[^\.,!?\b-\b]{0,15}(вало|дило|ейно|ело|ено|зано|ивое|ишь|кало|комо|лось|льно|мал|ойно|ояло|нее|нно станет|тите|ький|ясно)\b) \bвсе\b опять же границы слова [^\.,!?\b-\b] чтобы не искало если есть между словами точки, запятые, воск знаки, и тире |комо|лось|льно| окончания слов для слова всё )\b) чтобы искало только окончания 3 по поиску слов если есть и другие слова между ними (?i)(?<=(бледне(ют|ли)|гор(ели|ят)|неме(ли|ют)|ожег|раздул|раст(ер|ир)|\bтер\b|тер(ла|ли)|(вы|рас)тер|щекотал)[^\.,!?\b-\b]{0,30})\bщеки\b бледне(ют|ли)|гор(ели|ят) корень один но окончания разные [^\.,!?\b-\b] чтобы не искало если есть между словами точки, запятые, воск знаки, и тире {0,30} количество символов между словами \bщеки\b ограничение слова пы.сы. отдельное спасибо за подсказку с группами

odinokiyklaus: MoppoH пишет: На самом деле там все достаточно просто 1 если ищешь только по окончанию то регулярное выражение выглядит примерно так: (?i)(?<=(а(ли|ть|ют)|(г|дн|ж|к|х|хн|ш|шн|щ)ие|дел|ены|жит|иеся|или|ить|кины|лил|лись|няли|рил|рыл|сал|тся|шую|ые|ыть)\b.{0,5})\bокна\b Может я загоняюсь, но мне кажется всё совсем не так просто.. К примеру вышеприведённое выражение нежизнеспособно.. Поправьте меня, если я ошибаюсь.

MoppoH: почему Вы так решили, будут заменены, разбив(али) окна, разбив(ают) все окна, это можно проверить в отладке проекта в реальном времени. группа (а(ли|ть|ют)) содержит в себе две группы и все окончания на али, ать, ают, будут найдены на растояние 5 букв и пробелов от слова окна http://fotki.yandex.ru/users/moppoh1979/view/715643/

Cminant: odinokiyklaus Это баг в окне отладки. При редактировании нижнего поля (текст для проверки) в RegEx режиме автообновление не срабтывает, подсветка остается от предыдущего результата... В следующей версии будет исправлено, пока же нужно вручную обновалять кнопкой со стрелкой.

panalex: Не подскажете ли, уважаемые, существуют ли текстовые редакторы, поддерживающие все возможности синтаксиса внутри look-behind групп, как движок регулярных выражений, встроенный в .NET Framework? Или использующие этот движок. Сильно расширяются возможности автоматизации обработки текстов.

Cminant: panalex Есть редактор DtPad. Написан под .NET 4.0, есть поиск / замена по рег. выражениям.

panalex: Cminant Спасибо, буду пробовать

KOMODOR: подскажите гуманитарию, надо регулярное выражение, чтобы "*го гла<за", но с исключением "его глаза", - по всей моей практике, единственно необходимое регулярное выражение.

Cminant: KOMODOR [pre2](?<!\bе)го глаза\b[/pre2] как-то так

MoppoH: #(?i)(?<=(\Bего|ого)\b[^\.,!?-]{0,2})\bглаза\b=глазаъ< я пользуюсь таким, символ \B обозначает что это не конец слова, [^\.,!?-] обозначает что между его и глаза нет запятых и других знаков, \bглаза\b обозначает что будет искать только слово глаза, а не глазастых или Оглазар но все равно бывают исключения, зрачок его гла<за, закрыл его глаза<

KOMODOR: MoppoH порылся в существующих словарях регулярных выражений на сайте - нашел несколько правил, которые перекрыли всю необходимую потребность, на все случаи жизни. Да тут, оказывается, все есть, только вручную копаться надо...

wasyaka: MoppoH спасибо за ответ по словам, и если возможно, прокомментируйте (объясните) выделенное, в частности квадратные скобки: #(?i)(?<=((а|е|и|о|я)[бнтц]и(е|и|й|ю|я)|тви[еию]|\Bего|нием|ого|асть)\b[^\.,!?-]{0,2})\bбункера\b=бУнкера #(?i)(?<=([вн]ое|ое|[вщ]ая|ая|инул)\b[^\.,!?-]{0,2})\bбытие\b=бытиё И внекоторых рег. выражениях добавлен Ъ: #(?i)(?<=(ая|(ж|к|н)ая|была)\b[^\.,!?-]{0,2})\bбелка\b=бе<лкаъ #(?i)\bбелка\b(?=[^\.,!?-]{0,30}(колесе))=бе<лка ???

MoppoH2: в квадратных скобках указываются одинарные буквы, при нахождение которых срабатывает рег выражение в круглых скобках можно указать сочетание букв, при нахождение которых сработает рег выражение то есть (а|е|и|о|я)[бнтц]и(е|и|й|ю|я) найдет ение, ация а вот (тут можно написать что именно надо найди до|прис)[бнтц]и(е|и|й|ю|я) найдет присбию, присния в некоторых случая слова заканчивающиеся на А даже если стоит ударение все равно читает не правильно, а при добавление Ъ уже читает правильно видимо баг движка

odinokiyklaus: Лично для меня хорошим учебником была статья в Википедии и практика в написании выражений. Я отключил все словари, завел один, включил его и в нем ужен писал правила через notepad++ и в окне отладки словарей смотрел на получившиеся результаты. [бнтц] - один любой из символов из этого перечня [перечень одиночных символов] [бнтцоа]{1,2} {1,2}-квантификатор - означает один или два символа из перечня [] - пример цо ба ц б - все подходит {1,} - один и более (с правой стороны внутри после запятой нет ограничения) [бнтцоа]+ знак плюс после перечня - не менее одного символа из перечня [бнтцоа]? знак вопроса после перечня - ноль или один символ из перечня [^\.,!?-] - любой символ кроме . (точка) , ! ? - . - знак точки означает вообще любой один символ. Чтобы написать именно точку её экранируют \. это означает точку (она|оно|они) - любой вариант в скобках сработает. знак | - означает или \b - граница слова то есть \bвсе\b - найдет только слово все, а слово всех проигнорирует \В - середина слова Это условия поиска по типу если перед словом1 стоит слово2 или слово3, то слово1 будет найдено, а иначе не найдет. (?<=(слово2 |слово3))слово1 =слово<1 - заменяет найденное слово1 на слово<1 с ударением пример (?<=(слово2 |слово3 ))слово1=слово<1 - найдет в выражениях "слово2 слово1" или "слово3 слово1" слово1 и заменит его на слово<1 Не стесняйся эксперементировать и спрашивать! Удачи!



полная версия страницы