Как избежать просмотра назад в Postgres

В написанном мной запросе Postgres я пытаюсь найти пустой символ между цифрой и символом.

Необработанные данные выглядят примерно так:

"X  1111-11-112222-22-22YY 3333-33-334444-44-44ZZZ5555-55-556666-66-66AAA7777-77-778888-88-88B  9999-99-991111-11-11"

Я хотел бы разделить это на следующую таблицу:

X  1111-11-112222-22-22
YY 3333-33-334444-44-44
ZZZ5555-55-556666-66-66
AAA7777-77-778888-88-88
B  9999-99-991111-11-11

Итак, обычно я бы сделал это, определив регулярное выражение (?<\d)(?=[A-z]), которое дает мне пустой символ между символами и цифрами, но Postgres не поддерживает просмотр назад.

Кто-нибудь знает, как это исправить?

Заранее спасибо!


person Michael Werner    schedule 22.08.2014    source источник
comment
во-первых, про второе не подумал, извините.   -  person Michael Werner    schedule 22.08.2014


Ответы (2)


 (\w+\s*[\d-]+)

Это даст все группы. См. демонстрацию.

http://regex101.com/r/nW8dX7/1

person vks    schedule 22.08.2014
comment
Итак, если я правильно понимаю, вы извлекаете блоки XXX1111-11-112222-22-22? - person Michael Werner; 22.08.2014
comment
Хорошо, потому что фактические данные состоят из блоков этого типа, разделенных 10 или 13 (или, если они объединены, 23) пробелами, которые также извлекаются с помощью этого. Я пробовал версию без жадности, но я все еще застрял в пробелах. Есть идеи? - person Michael Werner; 22.08.2014
comment
(\w+\s*[\d-]+)\s* Попробуйте это. - person vks; 22.08.2014
comment
Все еще оставляет пробелы, даже с нежадной версией. - person Michael Werner; 22.08.2014
comment
regex101.com/r/nW8dX7/3 .взгляните на это.не знаю, почему ваш не работает - person vks; 22.08.2014
comment
Я думаю, проблема в том, что выражение соответствует блокам, вкл. пробелы и искл. (если вы наводите курсор на текст, он выделяет обе версии). - person Michael Werner; 22.08.2014
comment
Вы должны извлечь группы. Не сопоставляйте вещи while. - person vks; 22.08.2014
comment
Проблема в том, что я хочу заменить все эти пустые блоки трубами, а также вышеупомянутые блоки. - person Michael Werner; 22.08.2014
comment
Это должно быть сделано с помощью re.replace или какой-либо другой функции. Для этого потребуется другое регулярное выражение. - person vks; 22.08.2014
comment
Я открыт для этого. Теперь я попытался заменить все пробельные блоки с \s{3,} (чтобы информационные блоки не обрезались). Но regexp_replace(regexp_replace(mystring, '(\w+\s*[\d-]+?)','|','g'),'\s{3,}','|','g') возвращает только Pipes (это означает, что сами информационные блоки заменяются на |, чего я не хочу) - person Michael Werner; 22.08.2014
comment
Используйте (\w+\s*[\d-]+)\s* и замените на \1| - person vks; 22.08.2014
comment
замените первую группу, которая вам соответствует внутри () - person vks; 22.08.2014
comment
О, понял. Это даже дает мне почти желаемый результат, за исключением того, что между ними много пустых строк. Любой способ обойти это с помощью RegEx, или мне нужно вручную очистить их? - person Michael Werner; 22.08.2014
comment
Если ответ правильный с пустыми строками, лучше удалить отдельно, иначе нам придется проверять ввод и снова создавать регулярное выражение :). Удаление пустых строк должно быть простым. - person vks; 22.08.2014
comment
Хорошо, большое спасибо за вашу помощь и терпение: D (я бы проголосовал за вас, но моя репутация не позволяет мне: /) - person Michael Werner; 22.08.2014
comment
Я проголосовал за тебя, я все время вижу @vks, когда просматриваю вопросы с регулярными выражениями. - person asontu; 22.08.2014
comment
большое спасибо :P ирония в том, что я не могу ничего спросить........мои вопросы заблокированы. :( - person vks; 22.08.2014

Я бы сделал замену персонажем, на который вы потом сможете разделить. Я не знаком с psql, но что-то вроде:

split('~', replace(value, '\d(?=[A-z])', '$0~'))
person asontu    schedule 22.08.2014
comment
Это то, что я уже делаю, но он вставляет символ прямо перед цифрой, которая переносит его в следующий блок. - person Michael Werner; 22.08.2014
comment
Не могли бы вы опубликовать этот код? Это кажется странным, так как этот фрагмент явно указывает замене разместить ~ после $0. - person asontu; 22.08.2014