正则表达式PHP,邮政地址

时间:2015-10-06 12:15:18

标签: php regex

我知道邮政地址上的正则表达式不是最优的,但我真的在这里。

我解释了我的问题:我有不同类型的邮政地址:

  • 32 Rue Jean Jaures 69000 Lyon
  • Bâtiment 1 32 Rue Jean Jaures 69000 Lyon
  • 32 B Jean Jaures 69000 Lyon
  • Bâtiment 1 32 B Rue Jean Jaures 69000 Lyon

我需要一个正则表达式才能找到任何位置的街道号码。

我做了一个正则表达式,允许确定数字是否在字符串的开头:

`^([1-9][0-9]{0,2}(?:\s*[A-Z])?)\b`

您可以在此处查看结果:https://regex101.com/r/dY7cE6/3

但问题是,如果它不是我的第一个字符串就不能找到它(比如这个地址:Bâtiment 1 32 Rue Jean Jaures 69000 Lyon)

所以我请你帮忙在任何情况下找到这条街的号码,这是“32”。

我一直在寻找自己的搜索,但是会有所帮助。

谢谢。

3 个答案:

答案 0 :(得分:1)

以下正则表达式将在字符串中找到倒数第二个数字(在捕获组中)。如果在这个数字后面有一个字母(用空格分隔),它也会捕获这个。

它要求字符串中的最后一个数字是五位数的邮政编码:

/(\d+(?:\s*\w\b)?)[^\d]+\d{5}[^\d]+$/

但是,您需要多么可靠地识别门牌号码?输入数据的可能范围是多少?没有正则表达式方法可能非常好。 This question and answers对问题有所了解。

See it working on the sample data

答案 1 :(得分:1)

字符串中的最后一个数字,除非它是5位数,可选择在数字后面捕获一个字母:

^.*\b(?!\d{5}[A-Z]?\b)(\d+(?:\s*[A-Z]\b)?)

答案 2 :(得分:1)

\b(?!\d{5}\b)\d+\b(?:\s*\w\b)?(?=\D*\b\d{5}\b|\D*$)

试试这个。看看演示。

https://regex101.com/r/cJ6zQ3/20