- Сообщения
- 578
- Реакции
- 200
Здравствуйте.
Работаю над усовершенствованием grep'а для переноса коротких слов в тексте, чтобы они никогда не вылезали в конце строки.
Текущий рабочий grep выглядит вот так:
Переводя на человеческий, делает следующее: найти одно из слов в списке с разделителями |, заодно захватить следующий за ним пробел или знак пунктуации с пробелом, но перед этим проверить, нет ли пробела перед словом; поиск регистронезависимый.
Возникает проблема: обычно он работает правильно, но вот, например, в строчке "Dentro de un entorno", где попадаются два таких слова подряд он находит первое слово de и следующий за ним пробел, а вот слово un и следующий за ним пробел не находит.
Интуитивно понял, что предыдущий grep может просто не возвращаться к уже пройденному пробелу, и поэтому решил сделать проще и искать не "слово и пробел", а тупо пробел после искомого слова, так тоже получается нормально:
Но не понимаю, как сделать так, чтобы перед positive lookbehind (?<=de|un) сделать еще одну проверку на пробел; вот такой код не работает, совпадений не находит.
Если оставить как есть, без проверки на пробел, то находятся даже слова, которые заканчиваются на de и un, это недопустимо.
Как правильно вызвать два подряд positive lookbehind в последнем grep'е? Гугление по этому вопросу ничего не дало.
Если этого нельзя сделать, то как заставить самый первый grep находить второе слово?
Работаю над усовершенствованием grep'а для переноса коротких слов в тексте, чтобы они никогда не вылезали в конце строки.
Текущий рабочий grep выглядит вот так:
(?i)(?<= )(de|un)( |[[:punct:]] )+
Переводя на человеческий, делает следующее: найти одно из слов в списке с разделителями |, заодно захватить следующий за ним пробел или знак пунктуации с пробелом, но перед этим проверить, нет ли пробела перед словом; поиск регистронезависимый.
Возникает проблема: обычно он работает правильно, но вот, например, в строчке "Dentro de un entorno", где попадаются два таких слова подряд он находит первое слово de и следующий за ним пробел, а вот слово un и следующий за ним пробел не находит.
Интуитивно понял, что предыдущий grep может просто не возвращаться к уже пройденному пробелу, и поэтому решил сделать проще и искать не "слово и пробел", а тупо пробел после искомого слова, так тоже получается нормально:
(?i)(?<=de|un)( |[[:punct:]] )
Но не понимаю, как сделать так, чтобы перед positive lookbehind (?<=de|un) сделать еще одну проверку на пробел; вот такой код не работает, совпадений не находит.
(?i)(?<= )(?<=de|un)( |[[:punct:]] )
Если оставить как есть, без проверки на пробел, то находятся даже слова, которые заканчиваются на de и un, это недопустимо.
Как правильно вызвать два подряд positive lookbehind в последнем grep'е? Гугление по этому вопросу ничего не дало.
Если этого нельзя сделать, то как заставить самый первый grep находить второе слово?