Секреты регулярных выражений
- Fenix
- Администратор
Секреты регулярных выражений
В данной теме будем обсуждать правила на основе рег. выражений.Если задуматься над вопросом: "А что такое "регулярное выражение" вообще?", то ответ найдётся не сразу. Можно сказать, что это специализированный язык описания символьного шаблона (последовательности символов) поиска в строках текста.
Алексей Снастин
Что получится если?.. почему не получается если?..
Д. Фридл "Регулярные выражения" (3-е издание)
Данная книга откроет вам секрет высокой производительности. Тщательно продуманные регулярные выражения помогут избежать долгих часов утомительной работы и решить свои проблемы за 15 секунд. Ставшие стандартной возможностью во многих языках программирования и популярных программных продуктах, включая Perl, PHP, Java, Python, Ruby, MySQL, VB.NET, C# (и других языках платформы .NET), регулярные выражения позволят вам автоматизировать сложную и тонкую обработку текста.
Общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Включает описание якорей, символьных классов, утверждений, кванторов, групп и диапазонов, модификаторов и т. д.
Смотреть шпаргалку
- evmir_troll-hunter
- Администратор
Re: Секреты регулярных выражений
wasyaka писал(а): Jan 14 2018
Почему так:
рег выражение (\bвс)е\b(\s([А-Яа-яёЁ\-]+))?(\s([А-Яа-яёЁ\-]+))?(\s([А-Яа-яёЁ\-]+))?(\s\b(мелочи|мелочи)\b)=$1<:yo:>$2$4$6$8
срабатывает во всех случаях - от все мелочи до все 1-3 слова мелочи
но только при условии что $8 (последжние скобки) из двух и более слов?
Хорошая штука научный тык (2часа тыкал, брал одно слово и тЭстировал... вместо хорошо догадался совместить...), но всё же, почему?
- MoppoH
- Обыватель
Регулярные выражения, что и как
Очень интересное обсуждение рег выражений пошло у нас [...] предлагаю скидывать свои выражения, обсуждать как улучшить чужие.
(?i)\bвсе\b(?=.[\S]*(апно|асно|енно|ично|ливо|ль[кн]о|стро|точно)\b.[\S]+(!али|атся|ают|(в|м|н|ч)али|ваны|дели|емся|\Bили|лены|лись|нили|сели|ыкли|яли|ятся)\b)
а то часто бывают ложные срабатывания
типа такого, дырявые трубы или печи, заменит только один из омографов
\Bы<=Ы, и после обработки он заменит все < на большие буквы для Максима
вот тут не понял, что после \s может еще присутствовать там между двумя словами?
как показала многолетняя практика рассчитать количество символов практически не возможно, сейчас стараюсь уйти от этого вот таким путем
(?i)\bвсе\b(?=.[\S]*(апно|асно|енно|ично|ливо|ль[кн]о|стро|точно)\b.[\S]+(!али|атся|ают|(в|м|н|ч)али|ваны|дели|емся|\Bили|лены|лись|нили|сели|ыкли|яли|ятся)\b)
а то часто бывают ложные срабатывания
чем плохо что используется все предложение, тем что оба слова уже забиты одним рег выражением, и если допустим прилагательное + омограф уже найдено, то это прилагательное уже не пойдет к другому омографуwasyaka писал(а): ↑24 июл 2018 12:23( \s(\w+)?){1,}) - используется всё предложение (пропущенные(не использованные для правила) слова до ключевого заменяются пробелом) и это грубое правило, ниже(далее) по словарю более точные и т.д. отсюда и \s{1,4}, в отличии от KoobAudio где срабатывание на "первом встречном" и как бы наизнанку от точного к размытому .Из-за этого я и отказался от проги и перешёл на REX.
типа такого, дырявые трубы или печи, заменит только один из омографов
не понял в чем проблема со знаком <, можно добавить в словарик для Максима такое выражение
\Bы<=Ы, и после обработки он заменит все < на большие буквы для Максима
- tonio_k
- V.I.P.
Регулярные выражения, что и как
смысл этого выражения-правило сработает в обоих случаях: 1) между 2 искомыим словами присутствует ещё одно любое слово в связке с пробелом перед ним.
2) между этими двумя искомыми словами только пробел
- wasyaka
- V.I.P.
Регулярные выражения, что и как
не так поняли:MoppoH писал(а): ↑24 июл 2018 20:48чем плохо что используется все предложение, тем что оба слова уже забиты одним рег выражением, и если допустим прилагательное + омограф уже найдено, то это прилагательное уже не пойдет к другому омографу
типа такого, дырявые трубы или печи, заменит только один из омографов
Увидим кусок берега
#(?i)(?<=(забрызгивала|осмотрел|увидим)[^\.,!?-]{0,30})\bберега\b=берега<
Увидим кусок берегА
И ниже у Вас правило
#(?i)(?<=((вы|у)ступ|глубин|заросли|кусок|обрыв|полоск|приближение)[^\.,!?-]{0,30})\bберега\b=бе<рега
Оно и останится правилом - но не сработает в данном и во многих других случаях...
► Показать
В rex сработает последнее самое точное как фильтр грубая-средняя-тонкая очистка...
► Показать
- MoppoH
- Обыватель
Секреты регулярных выражений
если я правильно понял, dic срабатывает первое в списке рег выражение, а в rex последнее?
просто в этих выражениях не понятно какое из них сработает
#(?i)(?<=((вы|у)ступ|глубин|заросли|кусок|обрыв|полоск|приближение)[^\.,!?-]{0,30})\bберега\b=бе<рега
#(?i)(?<=(забрызгивала|осмотрел|увидим)[^\.,!?-]{0,30})\bберега\b=берега<
если у меня в словаре они идут в таком порядке, то замети на Увидим кусок бе<рега, а второго проигнорирует
просто в этих выражениях не понятно какое из них сработает
#(?i)(?<=((вы|у)ступ|глубин|заросли|кусок|обрыв|полоск|приближение)[^\.,!?-]{0,30})\bберега\b=бе<рега
#(?i)(?<=(забрызгивала|осмотрел|увидим)[^\.,!?-]{0,30})\bберега\b=берега<
если у меня в словаре они идут в таком порядке, то замети на Увидим кусок бе<рега, а второго проигнорирует
- tonio_k
- V.I.P.
Секреты регулярных выражений
MoppoH, правила в балаболке в словарях bxd обрабатываются строго по порядку - как записаны в словаре. Последующее правило переписывает результаты срабатывания предыдущего. Правила в формате REX могут чередоваться с DIC в любой комбинации - срабатывание будет по порядку их нахождения в словаре bxd. BXD это новый формат словаря - гибрид. В нем можно заводить строки правил как в формате DIC так и в REX в нужной для пользователя последовательности
Отправлено спустя 34 минуты 16 секунд:
С Максимом удобство в том, что можно одно и то же слово поменять несколько раз разными правилами. А вот с Николаем ситуация немного другая. Изменив в тексте берега на бе<рега слово берегав тексте уже отсутствует. И дальнейшие уточняющие правила уже не могут это слово отловить. Поэтому "последовательная" обработка вам не приемлема. Если вы не перелопатите все свои словари на схему:
берега=бЕрега
А в самом конце уточняющий соварь проставляющий ударения под Николая:
$*бЕ*=бе<
Схема условная в формате dic
Отправлено спустя 7 дней 12 часов 51 минуту 33 секунды:
MoppoH, для себя (пока) нашел такой простой способ поиска вместо ранее используемого мною [^\.,!?-]{0,30} - "примерно" три слова между искомыми словами. Теперь буду пытаться применять (|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s) - т.е. конкретно от 0 до 3 слов
Пример
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s)(\bпропасть\b)=между $1 $2 прОпасть
Сработает на:
Между вами пропасть
Между вами большая пропасть
Между вами самая большая пропасть
Между вами огромная по величине пропасть
Отправлено спустя 34 минуты 16 секунд:
С Максимом удобство в том, что можно одно и то же слово поменять несколько раз разными правилами. А вот с Николаем ситуация немного другая. Изменив в тексте берега на бе<рега слово берегав тексте уже отсутствует. И дальнейшие уточняющие правила уже не могут это слово отловить. Поэтому "последовательная" обработка вам не приемлема. Если вы не перелопатите все свои словари на схему:
берега=бЕрега
А в самом конце уточняющий соварь проставляющий ударения под Николая:
$*бЕ*=бе<
Схема условная в формате dic
Отправлено спустя 7 дней 12 часов 51 минуту 33 секунды:
MoppoH, для себя (пока) нашел такой простой способ поиска вместо ранее используемого мною [^\.,!?-]{0,30} - "примерно" три слова между искомыми словами. Теперь буду пытаться применять (|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s) - т.е. конкретно от 0 до 3 слов
Пример
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s)(\bпропасть\b)=между $1 $2 прОпасть
Сработает на:
Между вами пропасть
Между вами большая пропасть
Между вами самая большая пропасть
Между вами огромная по величине пропасть
- wasyaka
- V.I.P.
Секреты регулярных выражений
(| - уже ошибка
((\s(\w+)?){1,})>((\s(\w+)?){1,2})>((\s(\w+)?){1,3}) и т.д.???
И потом прослезитесь...
см. картинку
110391...
110392 и т.д
- tonio_k
- V.I.P.
Секреты регулярных выражений
нет не ошибка. Это как раз тот самый 0 слов между искомыми.
согласен, но большое количество скобок 2 или 3 в одном создаёт проблему с определением возврата переменной: $4 или $7 надо указать после равно? что бы результаты были не в перемешку? Для меня это вычислять очень сложно - только методом проб и ошибок. А "мой вариант" простой линейный и предсказуемый. Только один вариант вариант в скобках "()". Т.е. $1 или $2 - определить легко, он будет по порядку.
- wasyaka
- V.I.P.
Секреты регулярных выражений
Каждый выбирает по себе...
а MoppoH вообще автор регов для омографов в KooBAudio ... я лиш ученик и продолжатель в rex
- tonio_k
- V.I.P.
Секреты регулярных выражений
Задача - удалить задвоенные пробелы в тексте.
Вопрос, почему результаты разные? (в скобках пробел) -норм отрабатывает
- сбиваются абзацы в один сплошной текст
И еще вопрос: если в регулярных выражениях точка означает пробел, то как это выражение можно записать?
Вопрос, почему результаты разные?
Код: Выделить всё
( ){2,}=$1
Код: Выделить всё
(\s){2,}=$1
И еще вопрос: если в регулярных выражениях точка означает пробел, то как это выражение можно записать?
- wasyaka
- V.I.P.
- tonio_k
- V.I.P.
- tonio_k
- V.I.P.
Секреты регулярных выражений
когда это правило одно в словаре т.е. в идеальнх условиях действительно почему-то все корректно.
А вот попробуйте в 1.5. homographs.bxd - в самый конец добавить (\s){2,}=$1 вместо (\s)(\s)=$1 и прогнать текст.
А вот попробуйте в 1.5. homographs.bxd - в самый конец добавить (\s){2,}=$1 вместо (\s)(\s)=$1 и прогнать текст.
- wasyaka
- V.I.P.
Секреты регулярных выражений
А зачем это?
В Балаболке нет "красной" строки - соответственно абзац от абзаца отделяют два пробела которые (\s){2,}=$1 (от двух и до луны ) убираются, соответственно и текст сбивается, из-за этого и (\s)(\s)=$1 - убирается один пробел...
А вообще для этих целей существует форматирование текста в самой проге
► Показать
- MoppoH
- Обыватель
Секреты регулярных выражений
очень понравилась такая идея не искать количество символов возле слова, а искать именно число слов возле слова, как мне кажется так поиск идет более четко, вот у меня получилось такое выражение
#(?i)\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл
ищет от 0 до 4 слов после слова задвигал и если нет знаков препинания
- tonio_k
- V.I.P.
Секреты регулярных выражений
MoppoH, везет вам - не требуется указывать $1 $2...$7 после равно
попробовал ваш пример подогнать под Демагог/Балалболку.
Задвигал за ширму ящик Первый сюрприз - вот совсем не $1 после равенства, хотя казалось бы есть общая скобка и вроде бы она должна быть первой:
\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл $3
добавляю в текст запятую (а тут убираю: [^\.!?-])- все равно не срабатывает во всех случаях при наличии запятой в тексте
Предыдущий пример:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s)(\bпропасть\b)=между $1 $2 прОпасть
Немного сократил:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w*\s*\w*\s*\w*\s*)(\bпропасть\b)=между $1 $2 прОпасть
То же но с учетом наличия в тексте запятой:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w*\,*\s*\w*\,*\s*\w*\,*\s*)(\bпропасть\b)=между $1 $2 прОпасть
попробовал ваш пример подогнать под Демагог/Балалболку.
Задвигал за ширму ящик Первый сюрприз - вот совсем не $1 после равенства, хотя казалось бы есть общая скобка и вроде бы она должна быть первой:
\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл $3
добавляю в текст запятую (а тут убираю: [^\.!?-])- все равно не срабатывает во всех случаях при наличии запятой в тексте
\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл а разве выделеный участок как раз и не предполагает отсутствие какого либо знака препинания? Это же слово и сразу пробел после него. А [^\.,!?-] - подразумевает отсутствие знака препинания только перед словом ящик. Хотя обязательный пробел после \w - так же и запрещает знак препинания?
Предыдущий пример:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s)(\bпропасть\b)=между $1 $2 прОпасть
Немного сократил:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w*\s*\w*\s*\w*\s*)(\bпропасть\b)=между $1 $2 прОпасть
То же но с учетом наличия в тексте запятой:
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w*\,*\s*\w*\,*\s*\w*\,*\s*)(\bпропасть\b)=между $1 $2 прОпасть
- MoppoH
- Обыватель
Секреты регулярных выражений
не знаю как в других читалках работают рег выражения напишу как в кубаудио это ищет
\bзадвигал\b ищет целиком слово в тексте
(?=\s эта часть показывает что между словом что ищет и другим есть пробел
(\w+\s) показывает что надо найти слово с пробелом
{0,4} показывает что слов с пробелом должно быть от 0 до 4
[^\.,!?-]? это определяет что между этими словами от 0 до 4 не должно быть знаков препинания
(ящик)) означает какое слово должно быть в связке с искомым омографом
не знаю как точно должно работать оно у вас но типа такого должно сработать
\bзадвигал\b(\s(\w+\s){0,4}[^\.,!?-]?)(сундук|чемодан|ящик)=задвигАл $1 $+
- tonio_k
- V.I.P.
Секреты регулярных выражений
мне видется, что этот запрет в правиле лишний. Т.е. от него нет смысла. У вас в правиле ищется от 0 до 4 связка: "словопробел" эта связка сама по себе будет игнорировать связку "словозапятаяпробел". Другое дело, что без [^\.,!?-] само правило по каким то технически причинам не работает - типа обязательно аргумента.
- wasyaka
- V.I.P.
Секреты регулярных выражений
► Показать
Код: Выделить всё
(\w+(|)\b\s?(\w+)?)\s{1,4}(\b\b)=$1
(\b(|)(\w+)?(\s(\w+)?){1,})(\b\b)=$1
(\b(|)(\w+)?\s?(\w+)?)\s{1,4}\b(и|или|с)\b\s{1,4}(\b\b)=$1 $5
(\b(|)\b\s?(\w+)?)\s{1,4}\b(и|или|с)\b\s{1,4}(\b\b)=$1 $4
(\b(|)\b\s?(\w+)?)\s{1,4}(\b\b)=$1
\b(|)\b\s{1,4}(\b\b)=$1
(\b\b)(\s?(\w+)?\s{1,4}(\w+(|)\b))= $2
(\b\b)((\s(\w+)?){1,}(|)(\w+)?)= $2
(\b\b)\s{1,4}\b(и|или|с)\b(\s?(\w+)?\s{1,4}\b(|)\b)= $2 $3
(\b\b)(\s?(\w+)?\s{1,4}\b(|)\b)= $2
(\b\b)\s{1,4}\b(|)\b= $2
(\b\,)\s{1,4}\b(|)\b=, $2
\b(|)\b\s{1,4}(\b\b)\s{1,4}\b(|)\b=$1 XXX $3
@(\b\b)\s{1,4}\b([А-ЯЁ]\w+)\b= $2
@(\b\b)\s{1,4}\b([А-ЯЁ](\w+)?)= $2
(\…|\.|\,|\!|\?|\:|\;|\-)\s(\b\b)(\…|\.|\,|\!|\?|\:|\;|\ -)=$1 ххх$3
Отправлено спустя 10 часов 25 минут 18 секунд:
омограф в скобках для общей унификации и предотвращения путаницы с $
Код: Выделить всё
(\w+(|)\b\s?(\w+)?)\s{1,4}\b(авиа|мех)?(корпуса\b)=$1 $4корпусА
(\b(|)(\w+)?(\s(\w+)?){1,})\b(авиа|мех)?(корпуса\b)=$1 $6кОрпуса
(\b(|)\b\s?(\w+)?)\s{1,4}\b(и|или|с)\b\s{1,4}\b(авиа|мех)?(корпуса\b)=$1 $4 $5корпусА
\b(|)\b\s{1,4}\b(авиа|мех)?(корпуса\b)=$1 $2корпусА
\b(авиа|мех)?(корпуса\b)(\s?(\w+)?\s{1,4}(\w+(|)\b))=$1кОрпуса $3
\b(авиа|мех)?(корпуса\b)((\s(\w+)?){1,}(|)(\w+)?)=$1корпусА $3
\b(авиа|мех)?(корпуса\b)\s{1,4}\b(|)\b=$1корпусА $3
\b(авиа|мех)?(корпуса\b)=$1$2
Это как Восток - дело тонкое
- tonio_k
- V.I.P.
Секреты регулярных выражений
Пример правила:
\bвсё\b=всЪё
\bвсЪё\b=всё
под это правило попадают все варианты слов с разными регистрами: всё, Всё, всЁ, ВСЁ
а на выходе всегда будет всё
Вопрос, как прописать, что бы на выходе было слово всё но с таким же регистром букв, как первоначально
Отправлено спустя 6 минут 25 секунд:
Туплю на ночь глядя Каждый вариант прописать через @ (учёт регистра) и всего делов. Но может есть какое то написание, что бы в одну строку прописать?
\bвсё\b=всЪё
\bвсЪё\b=всё
под это правило попадают все варианты слов с разными регистрами: всё, Всё, всЁ, ВСЁ
а на выходе всегда будет всё
Вопрос, как прописать, что бы на выходе было слово всё но с таким же регистром букв, как первоначально
Отправлено спустя 6 минут 25 секунд:
Туплю на ночь глядя Каждый вариант прописать через @ (учёт регистра) и всего делов. Но может есть какое то написание, что бы в одну строку прописать?
- Arex
- Интересующийся
Секреты регулярных выражений
В это множество входят не только пробелы, но и табуляции, и переносы строк (\r и \n), так что не удивительно.
Не очень понимаю, зачем нужна замена, которая не меняет ничего?
- tonio_k
- V.I.P.
Секреты регулярных выражений
вот тут смысл приводится: http://i91650e3.beget.tech/viewtopic.php?p=153#p153
- Arex
- Интересующийся
Секреты регулярных выражений
Понятно.
Тогда в начале
а в конце
Так регистр сохранится.
Если же хочется именно "всЪё", можно так
Тогда в начале
Код: Выделить всё
\b(всё)\b=$1Ъ
Код: Выделить всё
\b(всё)Ъ\b=$1
Если же хочется именно "всЪё", можно так
Код: Выделить всё
\b(вс)(ё)\b=$1Ъ$2
\b(вс)Ъ(ё)\b=$1$2
- tonio_k
- V.I.P.
Секреты регулярных выражений
еще короче и удобнее применять такой блок: ((\s*\w*\s*){3})
в данном примере {3} - максимально допустимое количество вхождений слов т.е. от 0 до 3
получаем:
\b(между)\s+(нами|ними|вами)\b((\s*\w*\s*){3})\s+(пропасть)\b=между $2$3 прОпасть
Для не гарантии срабатываний - лучше всего вместо одного пробела всегда указывать \s+ (или " +" - пробел и квантификатор). Регулярные выражения на выходе иногда очень странные результаты по количеству пробелов выдают.
\b\s или \b\s\b или \s\b лучше сразу заменить на \s+
Не обязательно вводить ограничение слова \b если после последней буквы или перед первой буквой слова все равно идет пробел
Отправлено спустя 1 час 56 минут 37 секунд:
К сожалению ((\s*\w*\s*){3}) иногда выдает неверные результаты.
Поэтому, (\s*\w*\s*) - до 1 любого слова (\s*\w*\s*\w*\s*) - до 2 любых слов и т.д. пока самая стабильная комбинация.
- MoppoH
- Обыватель
Секреты регулярных выражений
а есть пример где он выдает неверный результат? у меня вот такое в этом выражение (нами|ними|вами)(\s\w*){0,4} поиск от 0 до 4 слов
- tonio_k
- V.I.P.
Секреты регулярных выражений
(\bзаявитесь\b)\s+((\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $2 $3
Если вы заявитесь на много раньше, чем это нужно.
выдает такой результат:
если вы заЯвитесь на много , чем это нужно
Я ожидаю что:
((\s*\w*\s*){3}) будет захвачен $2
(\bраньше\b) будет захвачен $3
но на деле это не так. Нужно добавлять $4. А мне так не нравиться - это не так "явно" хочу что бы правило было простым - сколько закрытых скобок, столько и захватов. И если скобки в скобках, то ожидаю, что берутся в захват именно первые и последние, а не те, что внутри.
Отправлено спустя 47 минут 8 секунд:
сейчас я применяю такие блоки:
\s+(\s*\w*\s*)\b
- если хочу повысить верхний предел слов то дублирую \w*\s* на нужное количество слов:
\s+(\s*\w*\s*\w*\s*)\b - 2 слова
\s+(\s*\w*\s*\w*\s*\w*\s*)\b - 3 слова
Если надо заложить больше трех слов, то уже можно и такой применить:
\b([^\.,!?-]*)\s+
\b и \s+ меняю местами по смыслу
- balaamster
- Обыватель
Секреты регулярных выражений
Все захваты нумеруются последовательно. Условно говоря, по открывающей скобке.
Чтобы захват не нумеровался, нужно перед открывающей скобкой поставить ?:
(\bзаявитесь\b)\s+((?:\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $2 $3
Если первая группа не используется в подстановке, то её вообще можно не захватывать:
\bзаявитесь\s+((?:\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $1 $2
- MoppoH
- Обыватель
Секреты регулярных выражений
либо указывать в рег выражение $+ указывающий последнюю группу
(\bзаявитесь\b)\s+((\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $2 $+
Отправлено спустя 19 минут 14 секунд:
в идеале оно должно выглядеть вот так
\bзаявитесь\b\s+((?:\s*\w*\s*){0,3})(\bраньше\b)=заЯвитесь $1 $+
\bзаявитесь\b - искомое слово
\s+ - пробел один или более
((?:\s*\w*\s*){0,3}) - пассивная группа, которая не учитывается для замены только для поиска от 0 до 3 слов
(\bраньше\b) - контрольное слово для поиска
(\bзаявитесь\b)\s+((\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $2 $+
Отправлено спустя 19 минут 14 секунд:
в идеале оно должно выглядеть вот так
\bзаявитесь\b\s+((?:\s*\w*\s*){0,3})(\bраньше\b)=заЯвитесь $1 $+
\bзаявитесь\b - искомое слово
\s+ - пробел один или более
((?:\s*\w*\s*){0,3}) - пассивная группа, которая не учитывается для замены только для поиска от 0 до 3 слов
(\bраньше\b) - контрольное слово для поиска
- tonio_k
- V.I.P.
Секреты регулярных выражений
\b(заявитесь)\b((?:\s*\w*\s*){3})\b(раньше)\b=заЯвитесь $2 $3
интересно, почему без \s+ не срабатывает?
Отправлено спустя 1 день 2 часа 53 минуты 19 секунд:
\b(в|ваши|вс[её]|всеъ|да|ей|за|им|их|как|на|на [егоёих]{1,3}|наши|них|по|про|продолжить|свои|твои|там|те|те же|через|чьи|эти|это)\b((?:\s*\w*\s*){1})\s+(бега)\b=$1$2 бегА
ваши один два три четыре пять бега
5 слов между ваши и бега а правило все равно срабатывает.
интересно, почему без \s+ не срабатывает?
Отправлено спустя 1 день 2 часа 53 минуты 19 секунд:
\b(в|ваши|вс[её]|всеъ|да|ей|за|им|их|как|на|на [егоёих]{1,3}|наши|них|по|про|продолжить|свои|твои|там|те|те же|через|чьи|эти|это)\b((?:\s*\w*\s*){1})\s+(бега)\b=$1$2 бегА
ваши один два три четыре пять бега
5 слов между ваши и бега а правило все равно срабатывает.
- wasyaka
- V.I.P.
Секреты регулярных выражений
Где-ударение.рф
В данном слове допускается ставить ударение либо на слог с буквой Я — заЯвитесь, либо на слог с буквой И — заявИтесь.
- good_cat
- Администратор
Секреты регулярных выражений
Морфологический разбор слова «заявитесь»:
Зая́витесь — 2 л., мн.ч., действ. залог, буд. вр., изъявит. накл. слова «заявиться».
Заяви́тесь — мн.ч., повелит. накл., действ. залог слова «заявиться».
Зая́витесь — 2 л., мн.ч., действ. залог, буд. вр., изъявит. накл. слова «заявиться».
Заяви́тесь — мн.ч., повелит. накл., действ. залог слова «заявиться».
- speech
- Обыватель
Секреты регулярных выражений
По сути - одно и то же: вся разница - в первом случае будущее время, а во втором повелительное наклонение.
И там, и там - множественное число, присущее правилам РЯ, которое может быть адресовано как группе лиц, так и персоне.
Отправлено спустя 5 минут 46 секунд:
"намного" здесь пишется слитно
от слова "как" ("очень" "рано"), а не "на сколько часов"
- tonio_k
- V.I.P.
Секреты регулярных выражений
Вот ведь прицепились к орфографии... Теперь надо отматывать что бы понять причем здесь орфография? Когда вопрос был задан про регулярные выражения.
- tonio_k
- V.I.P.
Секреты регулярных выражений
Код: Выделить всё
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
между_ вами_ *_ *_ *_ пропасть_=между_ вами_ *_ *_ *_ пропасть_
между_ вами_ *_ *_ пропасть_=между_ вами_ *_ *_ пропасть_
между_ вами_ *_ пропасть_=между_ вами_ *_ пропасть_
на
между_ вами_ *_ *_ *_ пропасть_=между_ вами_ _ _ _ пропасть_
между_ вами_ *_ *_ пропасть_=между_ вами_ _ _ пропасть_
между_ вами_ *_ пропасть_=между_ вами_ _ пропасть_
Вопрос, как можно вместо "дублирования" (=.*)(\*)(.*)::$1$3 прописать все в одну строку?
В данном примере каждая строчка удаляет только одну звездочку после знака равно. Т.е. если будет , например, *_ *_ *_ *_ *_ *_ *_ *_ *_ , то пара звездочек после знака равно останется не удаленной.
- balaamster
- Обыватель
Секреты регулярных выражений
Несколько дней возвращался к данному вопросу, так ничего не пришло в голову.
Только придумал, как скриптом в несколько строк заменить множество "*_ " на "_ ":
Код: Выделить всё
local a = [[между_ вами_ *_ *_ *_ пропасть_=между_ вами_ *_ *_ *_ пропасть_]]
local fnd1 = RexMatch(a, [[^.+(?==)]])
local fnd2 = RexMatch(a, [[=[^*]+((?:\*_ )+).+]] )
local fnd2_new = RexRepl(fnd2,{[[\*::]],})
local new_a = fnd1..fnd2_new
print(new_a)
- tonio_k
- V.I.P.
Секреты регулярных выражений
Спасибо за ответ.
Если через скрипт, то вместо дублирования строк, я бы через цикл прогнал.
Но мне интересно решить этот вопрос именно через "регулярные выражения". Есть предположение, что надо копать в сторону ленивых квантификаторов.
Если через скрипт, то вместо дублирования строк, я бы через цикл прогнал.
Но мне интересно решить этот вопрос именно через "регулярные выражения". Есть предположение, что надо копать в сторону ленивых квантификаторов.
- SAMERS
- Постоялец
Секреты регулярных выражений
Здравствуйте друзья.
Подскажите как правильно сделать регулярное выражения для поиска и замены в балаболке.
В тексте часто, особенно в литрпг встречается что то типо такого:
Подскажите как правильно сделать регулярное выражения для поиска и замены в балаболке.
В тексте часто, особенно в литрпг встречается что то типо такого:
Как сделать что бы в случае с цифрами читались + и - как плюс и минус.Первый урон: -7 здоровья
Добавилось +8 хп
- tonio_k
- V.I.P.
- SAMERS
- Постоялец
Секреты регулярных выражений
Не работает, почему то. Не читает + и -
И если так:
\-(\d)=минус $1
\+(\d):=плюс $1
так же не работает.
Если замены через регулярные выражения делать ( найти -(\d) и заменить на минус $1 )то, например:
-8 здоровья заменит на минус 1 здоровья
- tonio_k
- V.I.P.
Секреты регулярных выражений
Пример который я вам привел это под словари в формате rex. Балаболка его поддерживает но это не основной у неё формат словарей.
В Балаболке основной формат - bxd там "равно" или его аналог "::" не применяется.
При добавлении правил выбираете "регулярное выражение"
Левая часть правила из моего примера в поле заносится "что найти", а правая часть в "на что заменить".
Балаболка поддерживает словари в формате REX. Можно создать текстовый файл с расширением rex в папке со словарями и добавить мой пример "как есть" и обновить окно со словарями.
- balabolka
- V.I.P.
Секреты регулярных выражений
SAMERS
Всё так, как написал tonio_k.
"Добавить правило":
"Произносить" "регулярное выражение" \-(\d+)
"Как" "текст" минус $1
"Добавить правило":
"Произносить" "регулярное выражение" \+(\d+)
"Как" "текст" плюс $1
Всё так, как написал tonio_k.
"Добавить правило":
"Произносить" "регулярное выражение" \-(\d+)
"Как" "текст" минус $1
"Добавить правило":
"Произносить" "регулярное выражение" \+(\d+)
"Как" "текст" плюс $1
- tonio_k
- V.I.P.
Секреты регулярных выражений
Для понимания:
$1 - означает вернуть "как есть" всё что захватит в первых скобках.
А в скобках у нас \d что значит "любая цифра"
В вашем примере любая цифра это 8 вот она и будет возвращена без изменений. А минус исчезнет (так как его мы в скобки не захватили и не вернули) Вместо него появится слово "минус"
Ещё пример. Можно и так ввести:
Мы захватили в скобки знак минус и захватили в скобки любую цифру итого -два захвата.
А вот вернули только то, что во вторых скобках $2 а это у нас любая цифра. И перед ними поставили слово "минус"
то, например:
-8 здоровья заменит на минус 1 здоровья
Код: Выделить всё
\-(\d):: минус $1
А в скобках у нас \d что значит "любая цифра"
В вашем примере любая цифра это 8 вот она и будет возвращена без изменений. А минус исчезнет (так как его мы в скобки не захватили и не вернули) Вместо него появится слово "минус"
Ещё пример. Можно и так ввести:
Код: Выделить всё
(\-)(\d):: минус $2
А вот вернули только то, что во вторых скобках $2 а это у нас любая цифра. И перед ними поставили слово "минус"
- SAMERS
- Постоялец
Секреты регулярных выражений
Извиняюсь, а разве есть такая функция в программе?
Я через Notepad++ открываю файл и добавляю.
- tonio_k
- V.I.P.
Секреты регулярных выражений
давайте об этом на ветку балаболки перейдем. Тут вопросы про регулярные выражения
- SAMERS
- Постоялец
Секреты регулярных выражений
Спасибо за подробный ответ.tonio_k писал(а): ↑19 апр 2019 17:44$1 - означает вернуть "как есть" всё что захватит в первых скобках.
А в скобках у нас \d что значит "любая цифра"
В вашем примере любая цифра это 8 вот она и будет возвращена без изменений. А минус исчезнет (так как его мы в скобки не захватили и не вернули) Вместо него появится слово "минус"
Но заметил такой момент...
Если
и цифра написаны на цифровой клавиатуре то всё ок,читает а если-
напечатан на цифровой а цифры на другой то не читает.-
Не очень наверное понятно
Картинку прикреплю
Вот текст для примера
У меня в нем - не читает
Вот это уровень! За это время я не успел нанести ни одного удара, но тратить время не стал и пошёл в атаку. Выбрал сначала того, что брёл на меня слева. Два слабых удара, один усиленный — и бума завалился. Следующего не успел ударить — сам получил удар косой лапой в корпус: -8 здоровья. Только замахнулся для ответного удара — снова атака, но уже сбоку: -11 здоровья. Вот сволочи! Это уже был гобума, которого тут же снесло выстрелом Джиро. Надо сказать, он мне здорово помог, поскольку я успел убить второго буму и перешёл к третьему. С ним разделался без урона, а последнего косолапого монстра убил рейнджер.
- Вложения
-
- Screenshot_1.png (204.44 КБ) 55188 просмотров
- tonio_k
- V.I.P.
- SAMERS
- Постоялец
Секреты регулярных выражений
Файл fb2 не хочет сюда грузится.
Ссылка на гугл диск:
https://drive.google.com/file/d/1IdY_LL ... sp=sharing
Ссылка на гугл диск:
https://drive.google.com/file/d/1IdY_LL ... sp=sharing
- tonio_k
- V.I.P.
Секреты регулярных выражений
Вы не поняли. Я прошу примеры правил, которые срабатывают и которые не срабатывают из-за неправильного дефиса в файле.