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

时间:2021-01-26 15:37:05

标签: regex pcre

我们有一个“street_number”字段,多年来我们一直免费提交我们想要格式化的字段。使用正则表达式,我们想提取真正的“street_number”和“street_number_suffix”。

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

由于有十几种不同的模式,我很难正确调整正则表达式。我考虑使用两种不同的正则表达式,一种用于提取“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 来自 {{1} } 会匹配。添加条件可能没那么简单,这就是为什么我请你帮忙。

有人可以帮我解决这个问题吗?如果有帮助,这里有一个草稿:https://regex101.com/r/jGK5Sa/4


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

19-21

认为(?:(N°|(?<!\-|\/|\.|[a-z]|.{1})))\d+ 的全匹配不是N°10而是10(而且我们的ETL不支持捕获组,所以我不能使用N°10

1 个答案:

答案 0 :(得分:2)

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

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

说明

  • (?<! 负向后视
    • [-/.a-z\d] 使用字符类匹配任何列出的内容
  • ) 关闭负向后视
  • \d+ 匹配 1 个以上的数字

Regex demo

相关问题