2017-02-01 3 views
1

Я пытаюсь написать условие стиля регулярного выражения, чтобы извлечь только последнюю часть длинной строки. У меня возникли проблемы с его работой, поскольку формат строки несовместим. Я включил пример ниже:Regex последняя часть строки не соответствует шаблону или длине

2:0000:PlaceOne|2:30000:PlaceTwo|187768:20003:PlaceThree|187904:20011:PlaceFour|2614991:20033:PlaceFive|1166533:60006:PlaceSix 

В этом примере то, что мне нужно вывод, что является PlaceSix. В других примерах это могут быть PlaceFive, PlaceSeven и т. Д., Поэтому длина не всегда одинакова для всей строки или для того, что я извлекаю. Единственный последовательный шаблон - он всегда будет в конце строки и будет после последнего двоеточия (все символы после этого двоеточия). Я уверен, что это должно быть возможно с регулярным выражением, но до сих пор, к сожалению, не удалось заставить это работать.

Кроме того, расширяя эту логику, у меня есть связанный вопрос, если это можно сделать с помощью регулярного выражения, могу ли я также использовать ту же логику для извлечения другой части строки, если это необходимо? Так, например, для того же примера выше, если бы я хотел извлечь PlaceTwo, это возможно? Проблема в том, что я не могу представить, какой последовательности я могу представить, даже не будучи в конце строки, как в предыдущем примере PlaceSix. Это происходит после двоеточия, но, как вы видите, в строке есть несколько двоеточий. Номера также кажутся случайными, соответствующими местам. Думал, может быть, что-то вроде строк после x число двоеточий извлекает текст между ними и | хотя я даже не уверен, действительно ли это возможно.

Главный вопрос - первый вопрос, хотя, если это возможно, я рассмотрю этот вопрос. Вторая часть - скорее бонусный вопрос, если первый возможен, будучи настолько похожим, не думал, что стоит опубликовать два отдельных вопроса.

Надеюсь, я объяснил это правильно, сообщите мне, если требуются какие-либо дополнительные разъяснения. Большое спасибо.

ответ

1

Как это

:([^:]*)$ 

Вы можете проверить это here

И ответить на ваш другой вопрос, я бы сказал, что до тех пор, как вы знаете, что именно вы ищете, должен быть способ найти его.

Для примера, если я хочу, чтобы получить содержание после четвертого : каждый раз, его так просто, как:

^(?:[^:]*:){4}([^:]*) 

И изменить положение, все, что вам нужно сделать, это изменить 4 все, что вы хотите

Попробуй here

+0

Большое спасибо, отлично работает! – afropunk

1
drop table t; 
create table t (str varchar(1000)); 
insert into t (str) values ('2:0000:PlaceOne|2:30000:PlaceTwo|187768:20003:PlaceThree|187904:20011:PlaceFour|2614991:20033:PlaceFive|1166533:60006:PlaceSix 
'); 

select split_part(split_part(str,'|',1),':',3) as c1 
     ,split_part(split_part(str,'|',2),':',3) as c2 
     ,split_part(split_part(str,'|',3),':',3) as c3 
     ,split_part(split_part(str,'|',4),':',3) as c4 
     ,split_part(split_part(str,'|',5),':',3) as c5 
     ,split_part(split_part(str,'|',6),':',3) as c6 

from t 
; 

+----------+----------+------------+-----------+-----------+----------+ 
| c1  | c2  | c3   | c4  | c5  | c6  | 
+----------+----------+------------+-----------+-----------+----------+ 
| PlaceOne | PlaceTwo | PlaceThree | PlaceFour | PlaceFive | PlaceSix | 
+----------+----------+------------+-----------+-----------+----------+ 

select arr[1*3] as c1 
     ,arr[2*3] as c2 
     ,arr[3*3] as c3 
     ,arr[4*3] as c4 
     ,arr[5*3] as c5 
     ,arr[6*3] as c6 

from (select regexp_split_to_array(str,'[|:]') as arr 
     from t 
     ) t 

+----------+----------+------------+-----------+-----------+----------+ 
| c1  | c2  | c3   | c4  | c5  | c6  | 
+----------+----------+------------+-----------+-----------+----------+ 
| PlaceOne | PlaceTwo | PlaceThree | PlaceFour | PlaceFive | PlaceSix | 
+----------+----------+------------+-----------+-----------+----------+ 

select arr[1+1] as c1 
     ,arr[2+1] as c2 
     ,arr[3+1] as c3 
     ,arr[4+1] as c4 
     ,arr[5+1] as c5 
     ,arr[6+1] as c6 

from (select regexp_split_to_array('|'||str,'\|([^:]+:){2}') as arr 
     from t 
     ) t 

+----------+----------+------------+-----------+-----------+----------+ 
| c1  | c2  | c3   | c4  | c5  | c6  | 
+----------+----------+------------+-----------+-----------+----------+ 
| PlaceOne | PlaceTwo | PlaceThree | PlaceFour | PlaceFive | PlaceSix | 
+----------+----------+------------+-----------+-----------+----------+ 

select arr[1] as c1 
     ,arr[2] as c2 
     ,arr[3] as c3 
     ,arr[4] as c4 
     ,arr[5] as c5 
     ,arr[6] as c6 

from (select regexp_matches(str,'^.*?:([^:|]*)\|.*?:([^:|]*)\|.*?:([^:|]*)\|.*?:([^:|]*)\|.*?:([^:|]*)\|.*?:([^:|]*)$') as arr    
     from t 
     ) t 

+----------+----------+------------+-----------+-----------+----------+ 
| c1  | c2  | c3   | c4  | c5  | c6  | 
+----------+----------+------------+-----------+-----------+----------+ 
| PlaceOne | PlaceTwo | PlaceThree | PlaceFour | PlaceFive | PlaceSix | 
+----------+----------+------------+-----------+-----------+----------+ 
+0

Большое спасибо, интересное решение с массивами split, еще одно отличное решение! – afropunk

+0

Добро пожаловать. Все еще проверяем дополнительные решения. PostgreSQL ... бесконечные возможности. –

+0

O.K., достаточно играть за 1 день :-) –

Смежные вопросы