【问题标题】:postgres regex positive lookahead is not working as expectedpostgres 正则表达式积极前瞻未按预期工作
【发布时间】:2021-10-11 10:00:18
【问题描述】:

我想按照以下模式在文本中捕获标记:

前 2 个字符是字母并且是必需的,以 [A-Z] 或 [A-Z][0-9] 结尾,这是可选的,任何介于两者之间的字符都可以。

示例:

AA123123A1

AA123123A

AA123123123

我想匹配并捕获 在第 1 组中以 ([A-Z][A-Z]) 开头,在第 3 组中以 [A-Z] 或 [A-Z][0-9] 结尾,然后在第 2 组中以其他所有内容结束

例子:

AA123123A1 => [AA,123123,A1]

AA123123A。 => [AA,123123,A]

AA123123123 => [AA,123123123,'']

以下正则表达式在 python 中有效,但在 postgres 中无效。

regex='^([A-Za-z]{2})((?:.+)(?=[A-Za-z][0-9]{0,1})|(?:.*))([A-Za-z][0-9]{0,1}){0,1}$'

在 Postgressql 中

    select regexp_matches('AA2311121A1',
    '^([A-Za-z]{2})((?:.+)(?=[A-Za-z][0-9]{0,1})|(?:.*))(.*)$','x');

结果:

{AA,2311121A1,""}

我正在尝试探索为什么积极的前瞻行为与 python 不同,以及如何在这种情况下使 Postgres 中的积极前瞻工作。

【问题讨论】:

    标签: regex postgresql positive-lookahead


    【解决方案1】:

    你可以使用

    ^([A-Za-z]{2})(.*?)([A-Za-z][0-9]?)?$
    

    查看regex demo 和DB fiddle online:

    详情:

    • ^ - 字符串开头
    • ([A-Za-z]{2}) - 两个 ASCII 字母
    • (.*?) - 第 2 组:尽可能少的零个或多个字符
    • ([A-Za-z][0-9]?)? - 第 3 组:一个可选的 ASCII 字母序列,然后是一个可选的数字
    • $ - 字符串结束。

    【讨论】:

    • 谢谢@Wiktor 这很好用,但提出这个问题的动机更多是为了了解 Postgres 中正向前瞻的行为以及如何使其像在 python 中一样工作。
    • @YOGENDRASONI 那么,您只需要知道前瞻是如何工作的吗?它们在任何受支持的地方都可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多