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

时间:2019-01-03 13:57:43

标签: regex postgresql

我试图使用SUBSTRING函数使正则表达式提取某些信息,但是我在https://regex101.com/r/cFy11t/1上尝试过的REGEX在postgresql上返回错误:“量化操作数无效”

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

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

自从没有获得预期的输出以来,我已经对代码进行了很多更改,但是由于强制贪婪的量词“ ++”和“?+”来获取字母,因此我只得到一个错误可能

这是我的代码的最新版本,其中postgres会引发错误:(但是您可以单击链接以查看它的颜色可能更清楚)

SELECT SUBSTRING(Adresse, '(\d++((?:\s)?([A-G]|BIS|TER|QUARTER)?+\s)(?!$))(?!(.*\d+(\s)?[A-G]?+\D))')  Numero,

...

谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见online demo

主要要点是摆脱所有格量词,并确保在尾随模式是可选的情况下应用字符串检查的结尾。

详细信息

  • ^-字符串的开头
  • .*\y-尽可能多的0+个字符,直到最后一个单词边界(后跟...)
  • (\d+(?!\s?(?:BIS|TER|QUARTER|[A-G])$)\s?(?:BIS|TER|QUARTER|[A-G])?\y)-第1组(这将由SUBSTRING返回):
    • \d+-1个以上数字
    • (?!\s?(?:BIS|TER|QUARTER|[A-G])$)-后面没有可选的空格,然后是BISTERQUARTERA至{{1}的字母}放在字符串的末尾
    • G-可选的空格
    • \s?-(?:BIS|TER|QUARTER|[A-G])?BISTERQUARTERA
    • G-单词边界。

答案 1 :(得分:0)

我不清楚您的问题,但仍然尝试了一下。如果我的回答是错误的,那么我将举例说明您想要的结果。

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

链接到示例:https://regex101.com/r/cFy11t/4

更新

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

链接到示例:https://regex101.com/r/cFy11t/11

我希望这可以满足您的要求。如果没有,请告诉我。