德国门牌号的正则表达式

时间:2020-05-29 12:41:24

标签: regex validation

寻找指定德国门牌号的正则表达式:

有效门牌号:

  • 25
  • 25 a
  • 25b
  • 25-ab
  • 12-14
  • 1
  • 9
  • 21
  • 1a
  • 121羽
  • 25A
  • 25 a

无效的门牌号:

  • 1个a1
  • 1a1
  • 12ab12
  • 0
  • b
  • 0a
  • 00a
  • a a
  • 00 a
  • 13àâäèéêë

最后一个示例排除了每个非拉丁字符

我的正则表达式与应有的方式不符:

\d+(\s|-)?\w*$

编辑:对不起,我不得不更改上面的示例!请看看!

3 个答案:

答案 0 :(得分:4)

进行假设(因为您没有提供这些假设),这还应该排除诸如12-a112-1a12-0112-A1之类的模式。如果是这样,那么也许:

^[1-9]\d*(?:[ -]?(?:[a-zA-Z]+|[1-9]\d*))?$

请参见Online Demo


  • ^-开始字符串ancor。
  • [1-9]\d*-范围1-9中的一位数字,后跟零个或多个数字。
  • (?:-第一个非捕获组。
    • [ -]?-可选的空格或连字符。
    • (?:-第二个非捕获组。
      • [a-zA-Z]+|[1-9]\d*-来自a-zA-Z的一个或多个字符范围1-9的单个数字,后跟零个或多个数字。
    • )-关闭第二个非捕获组
  • )-关闭第一个非捕获组
  • ?-可选的第一个非捕获组(允许输入一位数字)。
  • $-结束字符串ancor。

Regular expression visualization

答案 1 :(得分:3)

您可以将空格或连字符设置为可选的[-\s]?,并在可选组中一起创建1个以上的字符。

如果门牌号不能以零开头,则可以以[1-9]

开始比赛
^[1-9]\d*(?:[-\s]?\w+)?$

Regex demo

如果25 A同样有效,则仅匹配a-z或0-9或A-Z

^[1-9]\d*(?:[-\s]?[a-zA-Z0-9]+)?$

Regex demo

答案 2 :(得分:0)

首先要问的是,这是否是个好主意…(请参阅标题为“虚假的程序员相信XYZ”的各种文章)我不在德国,但在奥地利附近,我的地址与您的任何示例都不匹配。 (有两种写方法,但都不匹配您的一种。)

除此之外:

  1. 您期望哪些匹配项不匹配?
  2. 与您期望的不符?
  3. 您使用的是哪种正则表达式?

一些明显的问题:

\d+(\s|-)?\w*$
   ^^^^^^^^^^

*匹配0个实例。因此,您允许使用破折号或空格,后接无字符。可能不是您想要的。试试:

\d+((\s|-)?\w+)?

这将使整个字母块为可选,但必须始终有一个字母。

其中的字母\w不是数字。因此,您需要明确允许它们。

\d+将匹配1个或多个数字,而不是“没有前缀0的数字”。如果您的第一位数不能为零,则需要对此进行明确说明:[1-9]\d*

您有一个结尾匹配字符$,但是没有开头匹配^。根据您的正则表达式检查是“匹配”还是“搜索”类型,您可能不希望两者都选择。 (即,如果您的正则表达式库调用尝试验证整个输入字符串,或者是否有任何子字符串匹配。)

相关问题