Страница 1 из 2
Секреты регулярных выражений
Добавлено: 20 июн 2018 16:30
Fenix
Если задуматься над вопросом: "А что такое "регулярное выражение" вообще?", то ответ найдётся не сразу. Можно сказать, что это специализированный язык описания символьного шаблона (последовательности символов) поиска в строках текста.
Алексей Снастин
В данной теме будем обсуждать правила на основе рег. выражений.
Что получится если?.. почему не получается если?..
Д. Фридл "Регулярные выражения" (3-е издание)
Данная книга откроет вам секрет высокой производительности. Тщательно продуманные регулярные выражения помогут избежать долгих часов утомительной работы и решить свои проблемы за 15 секунд. Ставшие стандартной возможностью во многих языках программирования и популярных программных продуктах, включая
Perl, PHP, Java, Python, Ruby, MySQL, VB.NET, C# (и других языках платформы
.NET), регулярные выражения позволят вам автоматизировать сложную и тонкую обработку текста.
Общее руководство по шаблонам регулярных выражений без учета специфики какого-либо языка. Включает описание якорей, символьных классов, утверждений, кванторов, групп и диапазонов, модификаторов и т. д.
Смотреть шпаргалку
Re: Секреты регулярных выражений
Добавлено: 28 июн 2018 21:24
evmir_troll-hunter
wasyaka писал(а): Jan 14 2018
Почему так:
рег выражение
(\bвс)е\b(\s([А-Яа-яёЁ\-]+))?(\s([А-Яа-яёЁ\-]+))?(\s([А-Яа-яёЁ\-]+))?(\s\b(мелочи|мелочи)\b)=$1<:yo:>$2$4$6$8
срабатывает во всех случаях - от
все мелочи до
все 1-3 слова
мелочи
но только при условии что $8 (последжние скобки) из двух и более слов?
Хорошая штука научный тык (2часа тыкал, брал
одно слово и тЭстировал...
вместо
хорошо догадался совместить...), но всё же, почему?
Регулярные выражения, что и как
Добавлено: 24 июл 2018 20:48
MoppoH
Очень интересное обсуждение рег выражений пошло у нас [...] предлагаю скидывать свои выражения, обсуждать как улучшить чужие.
wasyaka писал(а): ↑24 июл 2018 12:23
\s?(\w+)? -? означает может присутствовать, а может и нет
вот тут не понял, что после \s может еще присутствовать там между двумя словами?
tonio_k писал(а): ↑24 июл 2018 13:48
- в среднем длина слова в русском языке - 7 символов. 10 - это я с расчетом на "чуть выше средней" длины слова.
как показала многолетняя практика рассчитать количество символов практически не возможно, сейчас стараюсь уйти от этого вот таким путем
(?i)\bвсе\b(?=.[\S]*(апно|асно|енно|ично|ливо|ль[кн]о|стро|точно)\b.[\S]+(!али|атся|ают|(в|м|н|ч)али|ваны|дели|емся|\Bили|лены|лись|нили|сели|ыкли|яли|ятся)\b)
а то часто бывают ложные срабатывания
wasyaka писал(а): ↑24 июл 2018 12:23
( \s(\w+)?){1,}) - используется всё предложение (пропущенные(не использованные для правила) слова до ключевого заменяются пробелом) и это грубое правило, ниже(далее) по словарю более точные и т.д. отсюда и \s{1,4}, в отличии от KoobAudio где срабатывание на "первом встречном" и как бы наизнанку от точного к размытому .Из-за этого я и отказался от проги и перешёл на REX.
чем плохо что используется все предложение, тем что оба слова уже забиты одним рег выражением, и если допустим прилагательное + омограф уже найдено, то это прилагательное уже не пойдет к другому омографу
типа такого,
дырявые трубы или печи, заменит только один из омографов
tonio_k писал(а): ↑24 июл 2018 01:55
Не спорю хитро сделано в итоге знак "< " на последнюю букву для каждого слова на конце, что для Николая - самое то, а вот для Максима - не подходит.
не понял в чем проблема со знаком <, можно добавить в словарик для Максима такое выражение
\Bы<=Ы, и после обработки он заменит все < на большие буквы для Максима
Регулярные выражения, что и как
Добавлено: 24 июл 2018 21:33
tonio_k
MoppoH писал(а): ↑24 июл 2018 20:48
вот тут не понял, что после \s может еще присутствовать там между двумя словами?
смысл этого выражения-правило сработает в обоих случаях: 1) между 2 искомыим словами присутствует ещё одно любое слово в связке с пробелом перед ним.
2) между этими двумя искомыми словами только пробел
Регулярные выражения, что и как
Добавлено: 24 июл 2018 22:51
wasyaka
MoppoH писал(а): ↑24 июл 2018 20:48
чем плохо что используется все предложение, тем что оба слова уже забиты одним рег выражением, и если допустим прилагательное + омограф уже найдено, то это прилагательное уже не пойдет к другому омографу
типа такого, дырявые трубы или печи, заменит только один из омографов
не так поняли:
Увидим кусок берега
#(?i)(?<=(забрызгивала|осмотрел|
увидим)[^\.,!?-]{0,30})\bберега\b=берега<
Увидим кусок берегА
И ниже у Вас правило
#(?i)(?<=((вы|у)ступ|глубин|заросли|
кусок|обрыв|полоск|приближение)[^\.,!?-]{0,30})\bберега\b=бе<рега
Оно и останится правилом - но не сработает в данном и во многих других случаях...
► Показать
- 2018-07-24_224216.jpg (38.66 КБ) 59176 просмотров
Это чем реги в dic отличаются от rex
В rex сработает последнее самое точное как фильтр грубая-средняя-тонкая очистка...
► Показать
- 2018-07-24_214020.jpg (34.17 КБ) 59176 просмотров
Секреты регулярных выражений
Добавлено: 24 июл 2018 23:46
MoppoH
если я правильно понял, dic срабатывает первое в списке рег выражение, а в rex последнее?
просто в этих выражениях не понятно какое из них сработает
#(?i)(?<=((вы|у)ступ|глубин|заросли|кусок|обрыв|полоск|приближение)[^\.,!?-]{0,30})\bберега\b=бе<рега
#(?i)(?<=(забрызгивала|осмотрел|увидим)[^\.,!?-]{0,30})\bберега\b=берега<
если у меня в словаре они идут в таком порядке, то замети на Увидим кусок бе<рега, а второго проигнорирует
- KooBAudio_2018-07-24_23-43-11.png (87.67 КБ) 59158 просмотров
Секреты регулярных выражений
Добавлено: 24 июл 2018 23:54
tonio_k
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 прОпасть
Сработает на:
Между вами пропасть
Между вами большая пропасть
Между вами самая большая пропасть
Между вами огромная по величине пропасть
Секреты регулярных выражений
Добавлено: 01 авг 2018 15:57
wasyaka
tonio_k писал(а): ↑01 авг 2018 13:20
(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s) - т.е. конкретно от 0 до 3 слов
Пример
(| - уже ошибка
((\s(\w+)?){1,})>((\s(\w+)?){1,2})>((\s(\w+)?){1,3}) и т.д.???
tonio_k писал(а): ↑01 авг 2018 13:20
Если вы не перелопатите все свои словари на схему:
берега=бЕрега
И потом прослезитесь...
см. картинку
110391...
110392 и т.д
Секреты регулярных выражений
Добавлено: 01 авг 2018 16:27
tonio_k
wasyaka писал(а): ↑01 авг 2018 15:57
(| - уже ошибка
нет не ошибка. Это как раз тот самый 0 слов между искомыми.
wasyaka писал(а): ↑01 авг 2018 15:57
((\s(\w+)?){1,})
согласен, но большое количество скобок 2 или 3 в одном создаёт проблему с определением возврата переменной: $4 или $7 надо указать после равно? что бы результаты были не в перемешку? Для меня это вычислять очень сложно - только методом проб и ошибок. А "мой вариант" простой линейный и предсказуемый. Только один вариант вариант в скобках "()". Т.е. $1 или $2 - определить легко, он будет по порядку.
Секреты регулярных выражений
Добавлено: 01 авг 2018 20:02
wasyaka
tonio_k писал(а): ↑01 авг 2018 16:27
согласен, но
Каждый выбирает по себе...
а
MoppoH вообще автор регов для омографов в
KooBAudio ... я лиш ученик и продолжатель в rex
Секреты регулярных выражений
Добавлено: 02 авг 2018 01:17
tonio_k
Задача - удалить задвоенные пробелы в тексте.
Вопрос, почему результаты разные?
(в скобках пробел) -норм отрабатывает
- сбиваются абзацы в один сплошной текст
И еще вопрос: если в регулярных выражениях точка означает пробел, то как это выражение можно записать?
Секреты регулярных выражений
Добавлено: 02 авг 2018 07:18
wasyaka
tonio_k писал(а): ↑02 авг 2018 01:17
(\s){2,}=$1
- сбиваются абзацы в один сплошной текст
У меня в bxd срабатывает нормально
Секреты регулярных выражений
Добавлено: 02 авг 2018 10:52
tonio_k
wasyaka писал(а): ↑02 авг 2018 07:18
в bxd
Секреты регулярных выражений
Добавлено: 02 авг 2018 13:22
wasyaka
► Показать
- 2018-07-29_151128.jpg (48.71 КБ) 58998 просмотров
- 2018-07-29_154048.jpg (291.27 КБ) 58998 просмотров
Секреты регулярных выражений
Добавлено: 02 авг 2018 13:48
tonio_k
когда это правило одно в словаре т.е. в идеальнх условиях действительно почему-то все корректно.
А вот попробуйте в 1.5. homographs.bxd - в самый конец добавить (\s){2,}=$1 вместо (\s)(\s)=$1 и прогнать текст.
Секреты регулярных выражений
Добавлено: 02 авг 2018 19:56
wasyaka
tonio_k писал(а): ↑02 авг 2018 13:48
обавить (\s){2,}=$1 вместо (\s)(\s)=$1
А зачем это?
В Балаболке нет "красной" строки - соответственно абзац от абзаца отделяют два пробела которые (\s){
2,}=$1 (от двух и до луны
) убираются, соответственно и текст сбивается, из-за этого и (\s)(\s)=$1 - убирается один пробел...
А вообще для этих целей существует форматирование текста в самой проге
► Показать
- 2018-07-29_151128.jpg (43.62 КБ) 58978 просмотров
Секреты регулярных выражений
Добавлено: 04 авг 2018 20:23
MoppoH
tonio_k писал(а): ↑01 авг 2018 13:20
Пример
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w+\s|\w+\s\w+\s|\w+\s\w+\s\w+\s)(\bпропасть\b)=между $1 $2 прОпасть
Сработает на:
Между вами пропасть
Между вами большая пропасть
Между вами самая большая пропасть
Между вами огромная по величине пропасть
очень понравилась такая идея не искать количество символов возле слова, а искать именно число слов возле слова, как мне кажется так поиск идет более четко, вот у меня получилось такое выражение
#(?i)\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл
ищет от 0 до 4 слов после слова
задвигал и если нет знаков препинания
Секреты регулярных выражений
Добавлено: 05 авг 2018 00:34
tonio_k
MoppoH, везет вам - не требуется указывать $1 $2...$7 после равно
попробовал ваш пример подогнать под Демагог/Балалболку.
Задвигал за ширму ящик Первый сюрприз - вот совсем не $1 после равенства, хотя казалось бы есть общая скобка и вроде бы она должна быть первой:
\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл
$3
добавляю в текст запятую (а тут убираю: [^\.!?-])- все равно не срабатывает во всех случаях при наличии запятой в тексте
MoppoH писал(а): ↑04 авг 2018 20:23
если нет знаков препинания
\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 прОпасть
Секреты регулярных выражений
Добавлено: 05 авг 2018 11:56
MoppoH
tonio_k писал(а): ↑05 авг 2018 00:34
\bзадвигал\b(?=\s(\w+\s){0,4}[^\.,!?-]?(ящик))=задвигАл а разве выделеный участок как раз и не предполагает отсутствие какого либо знака препинания?
не знаю как в других читалках работают рег выражения напишу как в кубаудио это ищет
\bзадвигал\b ищет целиком слово в тексте
(?=\s эта часть показывает что между словом что ищет и другим есть пробел
(\w+\s) показывает что надо найти слово с пробелом
{0,4} показывает что слов с пробелом должно быть от 0 до 4
[^\.,!?-]? это определяет что между этими словами от 0 до 4 не должно быть знаков препинания
(ящик)) означает какое слово должно быть в связке с искомым омографом
не знаю как точно должно работать оно у вас но типа такого должно сработать
\bзадвигал\b(\s(\w+\s){0,4}[^\.,!?-]?)(сундук|чемодан|ящик)=задвигАл $1 $+
Секреты регулярных выражений
Добавлено: 06 авг 2018 10:36
tonio_k
MoppoH писал(а): ↑05 авг 2018 11:56
[^\.,!?-]? это определяет что между этими словами от 0 до 4 не должно быть знаков препинания
мне видется, что этот запрет в правиле лишний. Т.е. от него нет смысла. У вас в правиле ищется от 0 до 4 связка: "
словопробел" эта связка сама по себе будет игнорировать связку "
словозапятаяпробел". Другое дело, что без [^\.,!?-] само правило по каким то технически причинам не работает - типа обязательно аргумента.
Секреты регулярных выражений
Добавлено: 07 авг 2018 10:46
wasyaka
tonio_k писал(а): ↑06 авг 2018 10:36
Другое дело, что без [^\.,!?-] само правило по каким то технически причинам не работает
► Показать
- 2018-08-07_101939.jpg (31.48 КБ) 58884 просмотра
Код: Выделить всё
(\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 секунд:
wasyaka писал(а): ↑07 авг 2018 10:46
(\b\b)
омограф в скобках для общей унификации и предотвращения путаницы с
$
Код: Выделить всё
(\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
Для многих пар омографов (редких) шаблоны работают практически без ошибочно, а для часто встречаемых - индувидуальный подход...
Это как Восток -
дело тонкое
Секреты регулярных выражений
Добавлено: 12 окт 2018 00:47
tonio_k
Пример правила:
\bвсё\b=всЪё
\bвсЪё\b=всё
под это правило попадают все варианты слов с разными регистрами:
всё, Всё, всЁ, ВСЁ
а на выходе всегда будет
всё
Вопрос, как прописать, что бы на выходе было слово
всё но с таким же регистром букв, как первоначально
Отправлено спустя 6 минут 25 секунд:
Туплю на ночь глядя
Каждый вариант прописать через @ (учёт регистра) и всего делов. Но может есть какое то написание, что бы в одну строку прописать?
Секреты регулярных выражений
Добавлено: 14 окт 2018 09:52
Arex
tonio_k писал(а): ↑02 авг 2018 01:17
(\s){2,}=$1
- сбиваются абзацы в один сплошной текст
В это множество входят не только пробелы, но и табуляции, и переносы строк (\r и \n), так что не удивительно.
tonio_k писал(а): ↑12 окт 2018 00:53
Вопрос, как прописать, что бы на выходе было слово всё но с таким же регистром букв, как первоначально
Не очень понимаю, зачем нужна замена, которая не меняет ничего?
Секреты регулярных выражений
Добавлено: 14 окт 2018 10:45
tonio_k
Arex писал(а): ↑14 окт 2018 09:52
Не очень понимаю, зачем нужна замена, которая не меняет ничего?
вот тут смысл приводится:
http://i91650e3.beget.tech/viewtopic.php?p=153#p153
Секреты регулярных выражений
Добавлено: 14 окт 2018 11:21
Arex
Понятно.
Тогда в начале
а в конце
Так регистр сохранится.
Если же хочется именно "всЪё", можно так
Секреты регулярных выражений
Добавлено: 01 дек 2018 17:40
tonio_k
tonio_k писал(а): ↑05 авг 2018 00:34
\bмежду\b\s\b(нами|ними|вами)\b\s(|\w*\s*\w*\s*\w*\s*)(\bпропасть\b)=между $1 $2 прОпасть
еще короче и удобнее применять такой блок:
((\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 любых слов и т.д. пока самая стабильная комбинация.
Секреты регулярных выражений
Добавлено: 02 дек 2018 15:17
MoppoH
tonio_k писал(а): ↑01 дек 2018 19:37
К сожалению ((\s*\w*\s*){3}) иногда выдает неверные результаты.
а есть пример где он выдает неверный результат? у меня вот такое в этом выражение (нами|ними|вами)(\s\w*){0,4} поиск от 0 до 4 слов
Секреты регулярных выражений
Добавлено: 02 дек 2018 17:02
tonio_k
MoppoH писал(а): ↑02 дек 2018 15:17
выдает неверный результат?
(\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+ меняю местами по смыслу
Секреты регулярных выражений
Добавлено: 02 дек 2018 18:39
balaamster
tonio_k писал(а): ↑02 дек 2018 17:49
выдает такой результат:
если вы заЯвитесь на много , чем это нужно
tonio_k писал(а): ↑02 дек 2018 17:49
А мне так не нравиться - это не так "явно" хочу что бы правило было простым - сколько закрытых скобок, столько и захватов
Все захваты нумеруются последовательно. Условно говоря, по открывающей скобке.
Чтобы захват не нумеровался, нужно перед открывающей скобкой поставить ?:
(\bзаявитесь\b)\s+
((?:\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $2 $3
Если первая группа не используется в подстановке, то её вообще можно не захватывать:
\bзаявитесь\s+((?:\s*\w*\s*){3})(\bраньше\b)=заЯвитесь $1 $2
Секреты регулярных выражений
Добавлено: 02 дек 2018 18:57
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) - контрольное слово для поиска
Секреты регулярных выражений
Добавлено: 02 дек 2018 20:45
tonio_k
\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 слов между
ваши и
бега а правило все равно срабатывает.
Секреты регулярных выражений
Добавлено: 04 дек 2018 08:50
wasyaka
tonio_k писал(а): ↑03 дек 2018 23:38
\b(заявитесь)\b((?:\s*\w*\s*){3})\b(раньше)\b=заЯвитесь $2 $3
Где-ударение.рф
В данном слове допускается ставить ударение либо на слог с буквой Я — заЯвитесь, либо на слог с буквой И — заявИтесь.
Секреты регулярных выражений
Добавлено: 04 дек 2018 09:03
good_cat
Морфологический разбор слова «заявитесь»:
Зая́витесь — 2 л., мн.ч., действ. залог, буд. вр., изъявит. накл. слова «заявиться».
Заяви́тесь — мн.ч., повелит. накл., действ. залог слова «заявиться».
Секреты регулярных выражений
Добавлено: 07 янв 2019 20:56
speech
good_cat писал(а): ↑04 дек 2018 09:03
Зая́витесь — 2 л., мн.ч., действ. залог, буд. вр., изъявит. накл. слова «заявиться».
Заяви́тесь — мн.ч., повелит. накл., действ. залог слова «заявиться».
По сути - одно и то же: вся разница - в первом случае будущее время, а во втором повелительное наклонение.
И там, и там - множественное число, присущее правилам РЯ, которое может быть адресовано как группе лиц, так и персоне.
Отправлено спустя 5 минут 46 секунд:
tonio_k писал(а): ↑02 дек 2018 17:49
на много раньше
"намного" здесь пишется слитно
от слова "как" ("очень" "рано"), а не "на сколько часов"
Секреты регулярных выражений
Добавлено: 07 янв 2019 22:16
tonio_k
Вот ведь прицепились к орфографии... Теперь надо отматывать что бы понять причем здесь орфография? Когда вопрос был задан про регулярные выражения.
Секреты регулярных выражений
Добавлено: 23 мар 2019 10:13
tonio_k
Код: Выделить всё
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
(=.*)(\*)(.*)::$1$3
Меняет
между_ вами_ *_ *_ *_ пропасть_=между_ вами_ *_ *_ *_ пропасть_
между_ вами_ *_ *_ пропасть_=между_ вами_ *_ *_ пропасть_
между_ вами_ *_ пропасть_=между_ вами_ *_ пропасть_
на
между_ вами_ *_ *_ *_ пропасть_=между_ вами_ _ _ _ пропасть_
между_ вами_ *_ *_ пропасть_=между_ вами_ _ _ пропасть_
между_ вами_ *_ пропасть_=между_ вами_ _ пропасть_
Вопрос, как можно вместо "дублирования"
(=.*)(\*)(.*)::$1$3 прописать все в одну строку?
В данном примере каждая строчка удаляет только одну звездочку после знака равно. Т.е. если будет , например,
*_ *_ *_ *_ *_ *_ *_ *_ *_ , то пара звездочек после знака равно останется не удаленной.
Секреты регулярных выражений
Добавлено: 27 мар 2019 22:42
balaamster
tonio_k писал(а): ↑23 мар 2019 10:13
Вопрос, как можно вместо "дублирования" (=.*)(\*)(.*)::$1$3 прописать все в одну строку?
Несколько дней возвращался к данному вопросу, так ничего не пришло в голову.
Только придумал, как скриптом в несколько строк заменить множество "*_ " на "_ ":
Код: Выделить всё
local a = [[между_ вами_ *_ *_ *_ пропасть_=между_ вами_ *_ *_ *_ пропасть_]]
local fnd1 = RexMatch(a, [[^.+(?==)]])
local fnd2 = RexMatch(a, [[=[^*]+((?:\*_ )+).+]] )
local fnd2_new = RexRepl(fnd2,{[[\*::]],})
local new_a = fnd1..fnd2_new
print(new_a)
Секреты регулярных выражений
Добавлено: 27 мар 2019 23:11
tonio_k
Спасибо за ответ.
Если через скрипт, то вместо дублирования строк, я бы через цикл прогнал.
Но мне интересно решить этот вопрос именно через "регулярные выражения". Есть предположение, что надо копать в сторону ленивых квантификаторов.
Секреты регулярных выражений
Добавлено: 19 апр 2019 15:14
SAMERS
Здравствуйте друзья.
Подскажите как правильно сделать регулярное выражения для поиска и замены в балаболке.
В тексте часто, особенно в литрпг встречается что то типо такого:
Первый урон: -7 здоровья
Добавилось +8 хп
Как сделать что бы в случае с цифрами читались + и - как плюс и минус.
Секреты регулярных выражений
Добавлено: 19 апр 2019 15:31
tonio_k
SAMERS писал(а): ↑19 апр 2019 15:14
читались
Попробуете:
Секреты регулярных выражений
Добавлено: 19 апр 2019 16:48
SAMERS
tonio_k писал(а): ↑19 апр 2019 15:31
\-(\d)::минус $1
\+(\d)::плюс $1
Не работает, почему то. Не читает + и -
И если так:
\-(\d)=минус $1
\+(\d):=плюс $1
так же не работает.
Если замены через регулярные выражения делать ( найти -(\d) и заменить на минус $1 )то, например:
-8 здоровья заменит на минус 1 здоровья
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:01
tonio_k
SAMERS писал(а): ↑19 апр 2019 16:48
Не работает, почему то.
Пример который я вам привел это под словари в формате rex. Балаболка его поддерживает но это не основной у неё формат словарей.
В Балаболке основной формат - bxd там "равно" или его аналог "::" не применяется.
При добавлении правил выбираете "регулярное выражение"
Левая часть правила из моего примера в поле заносится "что найти", а правая часть в "на что заменить".
Балаболка поддерживает словари в формате REX. Можно создать текстовый файл с расширением rex в папке со словарями и добавить мой пример "как есть" и обновить окно со словарями.
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:26
balabolka
SAMERS
Всё так, как написал tonio_k.
"Добавить правило":
"Произносить" "регулярное выражение" \-(\d+)
"Как" "текст" минус $1
"Добавить правило":
"Произносить" "регулярное выражение" \+(\d+)
"Как" "текст" плюс $1
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:44
tonio_k
Для понимания:
то, например:
-8 здоровья заменит на минус 1 здоровья
$1 - означает вернуть "как есть" всё что захватит в первых скобках.
А в скобках у нас \d что значит "любая цифра"
В вашем примере любая цифра это 8 вот она и будет возвращена без изменений. А минус исчезнет (так как его мы в скобки не захватили и не вернули) Вместо него появится слово "минус"
Ещё пример. Можно и так ввести:
Мы захватили в скобки знак минус и захватили в скобки любую цифру итого -два захвата.
А вот вернули только то, что во вторых скобках
$2 а это у нас любая цифра. И перед ними поставили слово "минус"
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:49
SAMERS
balabolka писал(а): ↑19 апр 2019 17:26
"Добавить правило":
Извиняюсь, а разве есть такая функция в программе?
Я через Notepad++ открываю файл и добавляю.
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:55
tonio_k
SAMERS писал(а): ↑19 апр 2019 17:49
а разве есть такая функция в программе
давайте об этом на ветку балаболки перейдем. Тут вопросы про регулярные выражения
Секреты регулярных выражений
Добавлено: 19 апр 2019 17:55
SAMERS
tonio_k писал(а): ↑19 апр 2019 17:44
$1 - означает вернуть "как есть" всё что захватит в первых скобках.
А в скобках у нас \d что значит "любая цифра"
В вашем примере любая цифра это 8 вот она и будет возвращена без изменений. А минус исчезнет (так как его мы в скобки не захватили и не вернули) Вместо него появится слово "минус"
Спасибо за подробный ответ.
Но заметил такой момент...
Если
-
и цифра написаны на цифровой клавиатуре то всё ок,читает а если
-
напечатан на цифровой а цифры на другой то не читает.
Не очень наверное понятно
Картинку прикреплю
Вот текст для примера
У меня в нем
- не читает
Вот это уровень! За это время я не успел нанести ни одного удара, но тратить время не стал и пошёл в атаку. Выбрал сначала того, что брёл на меня слева. Два слабых удара, один усиленный — и бума завалился. Следующего не успел ударить — сам получил удар косой лапой в корпус: -8 здоровья. Только замахнулся для ответного удара — снова атака, но уже сбоку: -11 здоровья. Вот сволочи! Это уже был гобума, которого тут же снесло выстрелом Джиро. Надо сказать, он мне здорово помог, поскольку я успел убить второго буму и перешёл к третьему. С ним разделался без урона, а последнего косолапого монстра убил рейнджер.
Секреты регулярных выражений
Добавлено: 19 апр 2019 18:04
tonio_k
SAMERS писал(а): ↑19 апр 2019 17:55
напечатан на цифровой а цифры на другой то не читает.
а можно в файле пример. Что бы посмотреть разницу в кодировках
Секреты регулярных выражений
Добавлено: 19 апр 2019 18:11
SAMERS
Файл fb2 не хочет сюда грузится.
Ссылка на гугл диск:
https://drive.google.com/file/d/1IdY_LL ... sp=sharing
Секреты регулярных выражений
Добавлено: 19 апр 2019 18:23
tonio_k
Вы не поняли. Я прошу примеры правил, которые срабатывают и которые не срабатывают из-за неправильного дефиса в файле.