Regex字符串的最后一部分的模式或长度不一致



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

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

在这个例子中,我需要的输出是PlaceSix。在其他示例中,它可能是PlaceFive、PlaceSeven等,因此整个字符串或我提取的内容的长度并不总是相同的。唯一一致的模式是它总是在字符串的末尾,并且在最后一个冒号之后(该冒号之后的所有字符)。我确信regex一定可以做到这一点,但遗憾的是,到目前为止还无法实现这一点。

此外,在扩展这个逻辑时,我有一个相关的问题,如果可以通过regex实现这一点,如果需要,我是否也可以使用相同的逻辑来提取字符串的另一部分?例如,对于上面的同一个例子,如果我想提取PlaceTwo,这可能吗?问题是,我想不出一致的模式,甚至不像前面的PlaceSix示例那样位于字符串的末尾。它确实在冒号之后,但正如您所看到的,字符串中有多个冒号。这些数字也将看起来随机对应的地方。我在想,也许是在x个冒号之后,在两者之间提取文本:和|,尽管我甚至不确定这是否真的可能。

主要问题是第一个问题,如果可能的话,我会认为这个问题已经回答了。如果第一个问题可能的话,第二部分更像是一个额外的问题,因为如此相似,所以不值得发布两个单独的问题。

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

这个怎么样

:([^:]*)$

你可以在这里测试

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

举个例子,如果我想每次获得第四个:之后的内容,它很简单:

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

要改变位置,你所要做的就是将4更改为你想要的

在这里测试

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 |
+----------+----------+------------+-----------+-----------+----------+