寻找指定德国门牌号的正则表达式:
有效门牌号:
无效的门牌号:
最后一个示例排除了每个非拉丁字符
我的正则表达式与应有的方式不符:
\d+(\s|-)?\w*$
编辑:对不起,我不得不更改上面的示例!请看看!
答案 0 :(得分:4)
进行假设(因为您没有提供这些假设),这还应该排除诸如12-a1
,12-1a
,12-01
和12-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。
答案 1 :(得分:3)
您可以将空格或连字符设置为可选的[-\s]?
,并在可选组中一起创建1个以上的字符。
如果门牌号不能以零开头,则可以以[1-9]
^[1-9]\d*(?:[-\s]?\w+)?$
如果25 A同样有效,则仅匹配a-z或0-9或A-Z
^[1-9]\d*(?:[-\s]?[a-zA-Z0-9]+)?$
答案 2 :(得分:0)
首先要问的是,这是否是个好主意…(请参阅标题为“虚假的程序员相信XYZ”的各种文章)我不在德国,但在奥地利附近,我的地址与您的任何示例都不匹配。 (有两种写方法,但都不匹配您的一种。)
除此之外:
一些明显的问题:
\d+(\s|-)?\w*$
^^^^^^^^^^
*
匹配0个实例。因此,您允许使用破折号或空格,后接无字符。可能不是您想要的。试试:
\d+((\s|-)?\w+)?
这将使整个字母块为可选,但必须始终有一个字母。
其中的字母\w
不是数字。因此,您需要明确允许它们。
\d+
将匹配1个或多个数字,而不是“没有前缀0的数字”。如果您的第一位数不能为零,则需要对此进行明确说明:[1-9]\d*
。
您有一个结尾匹配字符$
,但是没有开头匹配^
。根据您的正则表达式检查是“匹配”还是“搜索”类型,您可能不希望两者都选择。 (即,如果您的正则表达式库调用尝试验证整个输入字符串,或者是否有任何子字符串匹配。)