1

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

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

例子:

AA123123A1

AA123123A

AA123123123

我想在第 1 组中匹配并捕获以 ([AZ][AZ]) 开头,在第 3 组中以 [AZ] 或 [AZ][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 中进行积极的前瞻工作。

4

1 回答 1

1

您可以使用

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

在线查看正则表达式演示数据库小提琴

在此处输入图像描述

详情

  • ^- 字符串的开始
  • ([A-Za-z]{2})- 两个 ASCII 字母
  • (.*?)- 第 2 组:尽可能少的任何零个或多个字符
  • ([A-Za-z][0-9]?)?- 第 3 组:一个可选的 ASCII 字母序列,然后是一个可选的数字
  • $- 字符串结束。
于 2021-10-11T10:04:41.047 回答