使用正则表达式从地址中提取数字

Extract number from address with regex

我需要从法国地址中提取号码。

这是我的正则表达式:

\d+( |\d+|bte|-|boite|[\w] {1}|([a-z] ){1}){0,2}

regex101 示例:https://regex101.com/r/ZP8DSV/1 它可以部分工作,但不适用于所有行。

我需要提取号码+额外信息。

如果我拿这个列表,它应该给我这个(每一行):

|---------------------------------------|--------------|
|              Original                 |     Result   |
|---------------------------------------|--------------|
| rue hovémont 3                        | 3            |
| rue hovémont 3-5                      | 3-5          |
| rue hovémont 3 5                      | 3 5          |
| Rue hovémont 35                       | 35           |
| Rue hovémont 46 A                     | 46 A         |
| Rue hovémont 46 A1                    | 46 A1        |
| 46 A1 Rue hovémont                    | 46 A1        |
| 46 A Rue hovémont                     | 46 A         |
| Rue du pont de pierre, 1              | 1            |
| Chaussée d alseg 416 c                | 416 c        |
| Chaussée d alseg, 416 c               | 416 c        |
| Chaussée d alseg 416c                 | 416c         |
| Chaussée d alseg, 416c                | 416c         |
| 416 c Chaussée d alseg                | 416 c        |
| 416 c, Chaussée d alseg               | 416 c        |
| 416c Chaussée d alseg                 | 416c         |
| 416c, Chaussée d alseg                | 416c         |
| Square de la demi-lune 7 boite 5      | 7 boite 5    |
| 7 boite 5 Square de la demi-lune      | 7 boite 5    |
| Rue aux laines 150/58                 | 150/58       |
| Rue de la forêt, 95                   | 95           |
| Chaussée d'anvers 294                 | 294          |
| Avenue jean sébastien bach, 24 bte 32 | 24 bte 32    |
| 10 bte 1 rue des volontaires          | 10 bte 1     |
| Rue du 5ème Tïme 5 bte 2              | 5 bte 2      |
| Rue du 5eme Tïme 5 bte 2              | 5 bte 2      |
| Rue du 5 eme Tïme 5 bte 2             | 5 bte 2      |
| Rue du 5 ème Tïme 5 bte 2             | 5 bte 2      |
| Rue du 1 er Tïme 5 bte 2              | 5 bte 2      |
| 20a Test Strasse                      | 20a          |
|---------------------------------------|--------------|

你能帮我解决这个问题吗? :)

这里是一个有效的正则表达式,用于捕获在开头或结尾以数字开头的文本:

^\d\w*(?:\h+(?>boite|bte|\pL\d?|\d)\b)*|\h\K\d+\pL?(?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*$

Updated RegEx Demo

对于 PHP 使用以下内容:

$re = '~^\d\w*(?:\h+(?>boite|bte|\pL\d?|\d)\b)*|\h\K\d+\pL?(?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*$~miu'

正则表达式详细信息:

  • ^: 开始
  • \d\w*:匹配以数字开头的单词
  • (?:: 启动一个非捕获组
    • \h+:匹配 1+ 个空格
    • (?>boite|bte|\pL\d?|\d):匹配 boitebte 或单个数字或字母(可选)后跟数字
    • \b: 字边界
  • )*:结束非捕获组。匹配该组中的 0 个或多个。
  • |: 或
  • \h:匹配一个空格
  • \K: 重置匹配
  • \d+\pL?:匹配 1+ 位后跟可选字母
  • \b: 字边界
  • (?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*:匹配剩余部分
  • $:结束