Regex 贪婪的正则表达式与postgresql不兼容?(子串匹配)

Regex 贪婪的正则表达式与postgresql不兼容?(子串匹配),regex,postgresql,Regex,Postgresql,我试图使用SUBSTRING函数生成一个正则表达式来提取一些信息,但是我尝试的正则表达式在postgresql上返回一个错误:“quantifier Operator invalid” 此子字符串的目标是提取字符串中的最后一个数字,如果该数字类似于“12B of street X”,则将补码包括为“A,B…G,或BIS,TER”。如果字符串中有多个数字,则应选择最后一个数字,除非最后一个数字位于字符串末尾 例如,在字符串“123 47F ABC 33 BIS”中,结果应为“47F” 我已经修改了

我试图使用SUBSTRING函数生成一个正则表达式来提取一些信息,但是我尝试的正则表达式在postgresql上返回一个错误:“quantifier Operator invalid”

此子字符串的目标是提取字符串中的最后一个数字,如果该数字类似于“12B of street X”,则将补码包括为“A,B…G,或BIS,TER”。如果字符串中有多个数字,则应选择最后一个数字,除非最后一个数字位于字符串末尾

例如,在字符串“123 47F ABC 33 BIS”中,结果应为“47F”

我已经修改了很多代码,因为我没有得到预期的输出,但是我只得到了一个错误,因为我强迫贪婪的量词“++”和“?+”如果可能的话得到字母

这是我的代码的最后一个版本,postgres在其中引发了一个错误:(但是你可以点击链接查看颜色,它可能更清晰)


谢谢你抽出时间

我不能清楚地理解你的问题,但我还是试了一下。如果我的回答是错误的,我将非常感谢你提供一些你想要的结果的例子

正则表达式:“
(\d+[A-G]+)”

链接到示例:

更新:

新的正则表达式:
“(?:\d+\w(?=\s\d+[A-z]{2,}));(\d+[A-z])(?=\s\d+[A-z])”

链接到示例:

我希望这能满足你的要求。如果没有,请告诉我。

您可以使用

'^.*\y(\d+(?!\s?(?:BIS|TER|QUARTER|[A-G])$)\s?(?:BIS|TER|QUARTER|[A-G])?\y)'

要点是去掉所有格量词,并确保应用字符串结束检查,同时考虑到尾随模式是可选的

详细信息

  • ^
    -字符串的开头
  • *\y
    -尽可能多的任何0+字符,直到最后一个单词边界(后跟…)
  • (\d+(?!\s)(?:BIS | TER | QUARTER |[A-G])$)\s(?:BIS | TER | QUARTER |[A-G])?\y)
    -第1组(这将由
    子字符串返回)
    • \d+
      -1+位
    • (?!\s)(?:BIS | TER | QUARTER |[A-G])$
      -后面不跟可选空格,然后在字符串末尾加上
      BIS
      ,或
      TER
      ,或
      QUARTER
      A
      G
      的字母
    • \s?
      -可选空白
    • (?:BIS | TER | QUARTER |[A-G])?
      -可选匹配
      BIS
      ,或
      TER
      ,或
      QUARTER
      A
      G
    • \y
      -单词边界

我认为这是由于所有格量词造成的。在PostgreSQL中尝试
“^(?:.*\D)(\D+(?!\s)(?:BIS | TER | QUARTER |[A-G])$)\s(?:BIS | TER | QUARTER |[A-G])?\y)
(在regex101中不起作用)。或者,
“^..*\y(\d+(?!\s)(?:BIS | TER | QUARTER |[A-G]))\s(?:BIS | TER | QUARTER |[A-G])?\y)
也可以。@WiktorStribiż非常感谢你,我已经尝试了第一个,从我所看到的,它似乎正是我所需要的!但是我不懂一些代码,你能给我解释一下吗?例如,(:BIS | TER | QUARTER |[A-G])$)是如何出现在结果中的,因为它应该是非捕获的,\y代表什么?最后,我很想知道,在互联网上是否有这么多地方可以知道regex101上使用的surregex和一个postgresql之间的区别?非常感谢。你好,谢谢你的回答,但这不是我想要的。我在寻找其他文本之前的最后一个数字,但是一些字符应该被视为文本的一部分,如果我的解释不清楚,很抱歉!例如,“11 12F 13F”应返回“12F”,而“11 12FF 13F”应返回“11”
'^.*\y(\d+(?!\s?(?:BIS|TER|QUARTER|[A-G])$)\s?(?:BIS|TER|QUARTER|[A-G])?\y)'