regex - 使用 postgres 正则表达式捕获一个点

标签 regex postgresql

我有这些字符串:

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 .

最佳答案

第一个懒惰模式使当前分支中的所有量词都懒惰,所以你的模式等价于

.*?(FD)([0-9]{6})(\.)??.*?
                     ^^  ^

查看其 demo at regex101.com

参见 9.7.3.1. Regular Expression Details excerpt :

...matching is done in such a way that the branch, or whole RE, matches the longest or shortest possible substring as a whole. Once the length of the entire match is determined, the part of it that matches any particular subexpression is determined on the basis of the greediness attribute of that subexpression, with subexpressions starting earlier in the RE taking priority over ones starting later.

您需要在一个分支中始终如一地使用量词:

regexp_matches(string, '.*(FD)([0-9]{6})(\.)?.*') as sqn

regexp_matches(string, '.*[[:blank:]](FD)([0-9]{6})(\.)?.*') as sqn

参见 regex demo

关于regex - 使用 postgres 正则表达式捕获一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41169426/

相关文章:

java - java的正则表达式

php - 防止php中的邮件注入(inject)拦截一些字符\r,\n,%0A,%0D

javascript - 正则表达式只捕获第一行

postgresql - 对唯一行值进行分组 Postgis、postgres 和 Qgis

sql - Postgresql:一行中多行的值

regex - 使用 Powershell 从字符串中获取键值

jQuery 匹配正则表达式

sql - 将转储/sql 文件导入我在 Linode 上的 postgresql 数据库

java - "Multiple ResultSets were returned by the query"的解决方法是什么

postgresql - GKE 上的多区域高可用性 - 如何处理 PostgreSQL 数据库?