正则表达式的最后一部分字符串不一致的模式或长度

时间:2017-02-01 16:59:04

标签: sql regex string postgresql

我试图编写一个正则表达式样式条件,只提取长字符串的最后一部分。由于字符串格式不一致,我无法使其正常工作。我在下面举了一个例子:

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

在此示例中,我需要的输出是 PlaceSix 。在其他示例中,它可以是PlaceFive,PlaceSeven等,因此整个字符串或我提取的内容的长度并不总是相同。唯一一致的模式是它始终位于字符串的末尾,并且位于最后一个冒号之后(该冒号之后的所有字符)。我确信这一切必须可以使用正则表达式,但到目前为止,令人遗憾的是无法使其正常工作。

同样扩展这个逻辑我有一个相关的问题,如果可以通过正则表达式做到这一点,我是否也可以使用相同的逻辑来提取字符串的另一部分?因此,例如对于上面的相同示例,如果我想提取PlaceTwo,那可能吗?问题是没有我能想到的一致模式,甚至不像以前的PlaceSix示例那样位于字符串的末尾。它确实在冒号之后,但正如您所看到的,字符串中有多个冒号。数字也似乎随机对应的地方。在考虑x之后的冒号提取文本之间的某些东西:和虽然我甚至不确定这是否真的可行。

主要问题是第一个问题,如果可能,我会考虑回答这个问题。如果第一部分是可能的话,第二部分更多的是奖金问题,如此相似并不认为值得发布两个单独的问题。

希望我已经正确解释了这一点,如果需要进一步澄清,请告诉我。非常感谢。

2 个答案:

答案 0 :(得分:1)

这是怎么回事。

:([^:]*)$

您可以对其进行测试here

要回答你的另一个问题,我会说,只要你知道你在寻找什么,就应该有办法找到它。

举一个例子,如果我想在每次第四次:之后获取内容,那就简单如下:

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

要改变立场,您所要做的就是将4更改为您想要的任何内容

测试here

答案 1 :(得分: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 |
+----------+----------+------------+-----------+-----------+----------+