我试图编写一个正则表达式样式条件,只提取长字符串的最后一部分。由于字符串格式不一致,我无法使其正常工作。我在下面举了一个例子:
2:0000:PlaceOne|2:30000:PlaceTwo|187768:20003:PlaceThree|187904:20011:PlaceFour|2614991:20033:PlaceFive|1166533:60006:PlaceSix
在此示例中,我需要的输出是 PlaceSix 。在其他示例中,它可以是PlaceFive,PlaceSeven等,因此整个字符串或我提取的内容的长度并不总是相同。唯一一致的模式是它始终位于字符串的末尾,并且位于最后一个冒号之后(该冒号之后的所有字符)。我确信这一切必须可以使用正则表达式,但到目前为止,令人遗憾的是无法使其正常工作。
同样扩展这个逻辑我有一个相关的问题,如果可以通过正则表达式做到这一点,我是否也可以使用相同的逻辑来提取字符串的另一部分?因此,例如对于上面的相同示例,如果我想提取PlaceTwo,那可能吗?问题是没有我能想到的一致模式,甚至不像以前的PlaceSix示例那样位于字符串的末尾。它确实在冒号之后,但正如您所看到的,字符串中有多个冒号。数字也似乎随机对应的地方。在考虑x之后的冒号提取文本之间的某些东西:和虽然我甚至不确定这是否真的可行。
主要问题是第一个问题,如果可能,我会考虑回答这个问题。如果第一部分是可能的话,第二部分更多的是奖金问题,如此相似并不认为值得发布两个单独的问题。
希望我已经正确解释了这一点,如果需要进一步澄清,请告诉我。非常感谢。
答案 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 |
+----------+----------+------------+-----------+-----------+----------+