匹配没有后缀的不同格式的街道号码

Match street number from different formats without suffixes

我们有一个多年来自由归档的“street_number”字段,我们希望对其进行格式化。使用正则表达式,我们想提取真正的“street_number”和“street_number_suffix”。

例如:17 b,“street_number”将是 17,而“street_number_suffix”将是 b

由于有十几种不同的模式,我很难正确调整正则表达式。我考虑使用 2 个不同的正则表达式,一个提取“street_number”,另一个提取“street_number_suffix”

这是我们想要格式化的一组详尽的模式和预期的输出:

# Extract street_number using PCRE

input           street_number   street_number_suffix

19-21           19              null
2 G             2               G
A               null            A
1 bis           1               bis
3 C             3               C
N°10            10              null
17 b            17              b
76 B            76              B
7 ter           7               ter
9/11            9               null
21.3            21              3
42              42              null

我知道我可以使用 \d+(?=\-) 调用匹配 任何数字直到连字符 的表达式。 它可以扩展为匹配 直到使用 \d+(?=\-|\/) 的连字符或斜杠 ,我想,一旦我将 \s 包含到此模式中,21 来自 19-21 将匹配。添加条件可能没那么简单,所以才请大家帮忙

谁能帮我解决这个问题?如果有帮助,请看这里的草稿:https://regex101.com/r/jGK5Sa/4


编辑:在我编辑的时候,这是我能找到的最接近的正则表达式:

(?:(N°|(?<!\-|\/|\.|[a-z]|.{1})))\d+

认为 N°10 的完整匹配不是 10 而是 N°10(而且我们的 ETL 不支持捕获组,所以我不能使用 /......(\d+)/)

要获取街道号码,您可以将模式更新为:

(?<![-/.a-z\d])\d+

说明

  • (?<! 负面回顾
    • [-/.a-z\d] 使用字符匹配任何列出的 class
  • ) 关闭负面回顾
  • \d+ 匹配 1+ 个数字

Regex demo