用于匹配德国邮政编码的正则表达式,但不是

Posted

技术标签:

【中文标题】用于匹配德国邮政编码的正则表达式,但不是【英文标题】:regex for matching german postal codes but not a 【发布时间】:2011-02-19 00:30:53 【问题描述】:

以下字符串:

23434 5465434

58495 / 46949345

58495 - 46949345

58495 / 55643

d 44444 ssdfsdf

64784

45643 dfgh

58495/55643

48593/48309596

675643235

34565435 34545

它只想提取粗体。它是一个五位数的数字(德语)。 它不应与我上面的示例中的电话号码 43564 36633445433 / 45663 等匹配。

我尝试了^\b\d5 之类的方法,但这不是一个好的开始。

有一些提示可以帮助我完成这项工作吗?

感谢所有提示

【问题讨论】:

请添加更多信息以说明为什么某些 5 位数字可以接受而其他数字不可接受。它们是特定范围吗?有具体的格式吗?您提供的信息越多,人们可以提供的答案就越好。事实上,人们不得不猜测你想要什么。 【参考方案1】:

您可以添加否定的前瞻断言以避免与电话号码匹配。

\b[0124678][0-9]4\b(?!\s?[ \/-]\s?[0-9]+)

如果您使用的是 Ruby 1.9,您也可以添加否定的后视断言。

【讨论】:

听起来就是这样。上面的 (?!...) 部分正在向前看,如果满足 ... 条件,则拒绝匹配。在 Ruby 1.9 中,我们可以使用 (? 我看到这个正则表达式在很多地方浮动,但它不正确。问题是任何以 3、5 或 9 开头的德国邮政编码都被视为无效,尽管它们完全有效并且也被使用。另见en.wikipedia.org/wiki/List_of_postal_codes_in_Germany【参考方案2】:

您尚未指定您要搜索的号码的区别。

根据您提供的示例字符串,您似乎只想: ^(\d5)\n

匹配以 5 位数字开头且不包含其他内容的行。

您可能希望在前 5 位数字之后允许一些空格(但不要其他): ^(\d5)\s*\n

【讨论】:

【参考方案3】:

我不完全确定指定的规则。但是,如果您想要以 5 位数字开头且不包含其他数字的行,这可能会起作用:

^(\d5)[^\d]*$

如果前导空格没问题,那么:

^\s*(\d5)[^\d]*$

这是显示结果的Rubular link。

【讨论】:

看起来很有希望,但我不想在第二场比赛中匹配字符,d 44444 ssdfsdf 也应该匹配 =/ 非常复杂【参考方案4】:
^\D*(\d5)(\s(\D)*$|()$)

这应该(未经测试)匹配:

以五位数字(或一些非数字然后是五位数字)开头的行,然后 一个空格,并以一些非数字结尾 以 5 开头和结尾的行 数字(或一些非数字,然后是五位数字)

\1 将是五位数字

\2 将是整个下半场,如果有的话

\3 将是数字之后的单词,如果有的话

编辑以适合提问者编辑的问题

再次编辑:我想出了一个更优雅的解决方案:

^\D*(\d5)\D*$

【讨论】:

也是一个好的开始。但它也匹配字符,如果该行以其他字符开头然后是数字(检查编辑)你的匹配项 => rubular.com/r/9FUAYtkP4X 其实我只是想出了一个更好的解决方案。检查帖子。 嗯,对不起。不适合我,因为它包括字符。空格没问题,但字符是。 老实说,您将不得不更加具体。没有人知道你所说的“字符”是什么意思。它们都是所有个字符。

以上是关于用于匹配德国邮政编码的正则表达式,但不是的主要内容,如果未能解决你的问题,请参考以下文章

常用正则表达式

优化德国手机号码的正则表达式

正则表达式之匹配汉字

python 正则表达式怎么匹配

正则表达式匹配一个或两个引号,但不是连续三个

正则表达式匹配带有标点的单词,但不是单独的标点