我有这些字符串:
3 FD160497. 2016 abcd
3 FD160497 2016 abcd
我想捕获“FD”,数字,然后是点,如果它存在。
我试过了:
SELECT
sqn[1] AS letters,
sqn[2] AS digits,
sqn[3] AS dot
FROM (
SELECT
regexp_matches(string, '.*?(FD)([0-9]{6})(\.)?.*') as sqn
FROM
mytable
) t;
(PostgreSQL 9.5.3)
在这两种情况下,“点”列都是NULL
,我真的不知道为什么。
它适用于regex101。
答案 0 :(得分:1)
第一个懒惰模式使当前分支中的所有量词变得懒惰,因此您的模式等同于
.*?(FD)([0-9]{6})(\.)??.*?
^^ ^
请参阅9.7.3.1. Regular Expression Details excerpt:
...匹配是以这样一种方式完成的,即分支或整个RE与整个最长或最短的子串匹配。一旦确定了整个匹配的长度,就根据该子表达式的贪婪属性确定匹配任何特定子表达式的部分,在RE中较早开始的子表达式优先于稍后开始的子表达式。
您需要在一个分支中始终使用量词:
regexp_matches(string, '.*(FD)([0-9]{6})(\.)?.*') as sqn
或
regexp_matches(string, '.*[[:blank:]](FD)([0-9]{6})(\.)?.*') as sqn
请参阅regex demo