伊朗邮政编码验证

28

请帮我使用正则表达式验证伊朗邮政编码。

我为此编写了以下正则表达式:\b([^02\n\D]){4}[^5](\d){5},但它不能满足第5和第7条规则。

请帮我修复它。

以下是关于这个正则表达式的一些规则:

  1. 全部是数字

  2. 10位数字

  3. 前5位数字不能使用0

  4. 邮政编码不能使用数字2

  5. 前4位数字不相同

  6. 第5位数字不能是5

  7. 所有数字都不相同


1
特别是要添加一个MCVE,并详细说明规则以及匹配或不匹配的示例。 - PJProudhon
2
这似乎并不是正则表达式适合处理的工作。 - yunzen
不要依赖第四条规则!许多邮政编码在不同的位置都有数字2! - Ali Hosseinzadeh
1
@AliHosseinzadeh,您在此更新了邮政编码中未检查2的内容,以下是正则表达式: ^(?!0)\d(?!([0-9])\1{3})[1-9]{3}[1346-9][013-46-9][1-9](?!\1{8})\d$ - MasOOd.KamYab
1个回答

32

以下正则表达式符合您的条件:

\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b

点击查看演示

说明:

  • \b - 单词边界
  • (?!(\d)\1{3}) - 负向先行断言,确保前四个数字不相同。
  • [13-9]{4} - 匹配除了 02 以外的所有数字出现了四次
  • [1346-9] - 匹配单个数字,不是 0,25
  • [013-9]{5} - 匹配除了 2 以外的所有数字出现了五次
  • \b - 单词边界

非常抱歉,我读了一些关于伊朗邮政编码的文章,似乎“0”可以出现在第二个5位数字中,但不能出现在前5位数字中。我已经修正了我的问题。 - MasOOd.KamYab
@MasOOd.KamYab 我已经更新了解决方案。另外,请检查演示。 - Gurmanjot Singh
(?!(\d)\1{3}) - 负向先行断言,确保前三位数字不相同。 - ABlue
我知道这是一个老问题,但它在重新开启队列中出现了。这是一个非常聪明的答案,但我认为任何需要用7个项目说明的正则表达式都很难维护,特别是如果有人被指派执行此操作。 - Wonko the Sane
1
@WonkotheSane 需要解释以考虑到不同类型的受众。我尽可能详细地回答问题,无论其复杂性如何,这样在评论部分就会减少来回沟通。 :) - Gurmanjot Singh
1
@GurmanjotSingh - 我完全同意。只是当我遇到某人编写了复杂的正则表达式代码时,我会在心里诅咒一下。 :) - Wonko the Sane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接