我们有一个“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
)
答案 0 :(得分:2)
要获取街道号码,您可以将模式更新为:
(?<![-/.a-z\d])\d+
说明
(?<!
负向后视
[-/.a-z\d]
使用字符类匹配任何列出的内容)
关闭负向后视\d+
匹配 1 个以上的数字