我试图使用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,
...
谢谢您的时间!
答案 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])$)
-后面没有可选的空格,然后是BIS
或TER
或QUARTER
或A
至{{1}的字母}放在字符串的末尾G
-可选的空格\s?
-(?:BIS|TER|QUARTER|[A-G])?
或BIS
或TER
或QUARTER
至A
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
我希望这可以满足您的要求。如果没有,请告诉我。