我正在尝试创建一个匹配丹麦地址的正则表达式,如:
要求是:
到目前为止,我想出了这个,但我想知道它是否可以优化/“漂亮”
/^([a-zA-ZæøåÆØÅ]{2,40}\.?\s{1}){1,}([0-9]){1,}.*$/
我不能使用“Word Boundaries”(\ w)因为街道可以像æøåÆØÅ这样的特殊字符开始/结束。除了\ b以外还有其他办法吗?
此外,我的代码不会检查门牌号码长度。我该怎么做?
由于
答案 0 :(得分:1)
首先,你的正则表达式似乎可以完成你想要的工作。在javascript中,你只能使用仍然频繁使用的最糟糕的正则表达式引擎之一,所以美化并不是那么简单。
/^
([a-zA-ZæøåÆØÅ]{2,40}\.? # 1.
\s{1}){1,} # 2.
([0-9]){1,} # 3.
.*$/
丹麦的地址是否仅限于40个字符?你能确定这个限制吗?您可以将大写+小写与单个组匹配:A-z
如果您正在使用另一种正则表达式,我建议使用unicode语言分组(\p{L}
)而不是该字符组。查看示例here
\s{1}
是多余的,您可以安全地删除{1}
关于该组之后的{1,}
,可以用+
至于街道号码的长度,您在任何情况下都接受门牌号后的任何内容,因此您最后需要一些额外的匹配标准。
将结束更改为限制事项:([0-9]){1,5}\w?(\s.*)?$
总而言之,正则表达式看起来像这样:
^([A-zæøåÆØÅ]{2,40}\.?\s)+([0-9]){1,5}\w?(\s.*)?$
看到它的工作:regex101
简短免责声明:在regex101的示例中,您会看到一些匹配跨越2行。这是因为最后\s
匹配换行符,.*
匹配该行的其余部分。如果您在不太可能出现问题的表单中验证字段。