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

问题描述

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

这是我的正则表达式:

\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)*:匹配剩余部分
  • $:结束