Главная > SQL > Разбить строку на строчки по 100 символов, не разбивая слова


Разбить строку на строчки по 100 символов, не разбивая слова

with t as (
select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
           || 'Но слова разбивать нельзя, переносить нужно по '
           ||rpad('qwerty',110,'o')||'абвгд' as s from dual
)
select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level))
from t
CONNECT BY
 regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as apps

SQL> with t as (
  2      select 'есть длинная строка - которую нужно разбить на строчки по сто символов.'
  3              || 'Но слова разбивать нельзя, переносить нужно по '
  4        ||rpad('qwerty',110,'o')||'абвгд' as s from dual
  5  )
  6  select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level)) as str
  7  from t
  8  CONNECT BY
  9   regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}',1,level) is not null;

STR
--------------------------------------------------------------------------------
есть длинная строка - которую нужно разбить на строчки по сто символов.Но слова
переносить нужно по
qwertyoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooабвгд

Похожие записи:

  1. Елена
    5 Август 2011 в 10:44 | #1

    Раньше не пользовалась регулярными выражениями, решила поизучать на ваших примерах.
    Проверила ваш пример (в TOAD), получила другой результат:
    with t as (
    select ‘есть длинная строка — которую нужно разбить на строчки по сто символов.’
    || ‘Но слова разбивать нельзя, переносить нужно по ‘
    ||rpad(‘qwerty’,110,’o’)||’абвгд’ as s from dual
    )
    select trim(regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}’,1,level))
    from t
    CONNECT BY
    regexp_substr(s,'(.{0,99}(\s|$))|[^[:space:]]{100}’,1,level) is not null;
    —————————————в рез-те только это:
    qwertyoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
    ooooooooooабвгд

  2. rudev
    5 Август 2011 в 11:08 | #2

    @Елена
    Попробуйте выполнить данный запрос в sql*plus.

    Только что запустил запрос на базе 11.2.0.2.0, отработало корректно.

  3. Елена
    15 Август 2011 в 14:20 | #3

    SQL*Plus Version 10.1.0.4.2 — результат такой же.
    В более старых версиях, чем ваша, по другому работает?

  4. rudev
    16 Август 2011 в 08:57 | #4

    @Елена
    С версии 10gR2 регулярные выражения работают несколько иначе, видимо связано с этим.
    Почитайте, например,Жадная и ленивая квантификация в регулярных выражениях

  1. 9 Январь 2011 в 14:13 | #1