【问题标题】:Regex for homework家庭作业的正则表达式
【发布时间】:2017-05-26 08:20:01
【问题描述】:

这是我初学者班的一些家庭作业。

一个组织已为所有客户分配了一个身份号码。身份证号格式如下:

  • 2 个数字字符(不带前导 0 的数字),后跟 3 个数字字符(数字)和 3 个数字字符(数字),由单个空格分隔

  • 或 3 个数字字符(不带前导 0 的数字)后跟 3 个数字字符(数字)和 3 个数字字符(数字),由单个空格分隔。

  • 任何小于 10 000 000 或 >150 000 000 的数字都是无效的。

这是我的尝试:

([\\d]{2}[\\s][\\d]{3}[\\s][\\d]{3})|([\\d]{3}[\\s][\\d]{3}[\\s][\\d]{3})

但是,以下输出应该不起作用,但它们确实起作用:

153 394 111
943 293 492
098 302 203

感谢任何帮助。谢谢

以下是有效的输入:

11 304 982
39 683 234
139 920 393

以下是无效输入:

153 394 111
3 394 234
89 909 98

【问题讨论】:

  • 为什么它们不能工作?我可以看到第三个有一个前导零(你根本没有检查那些),但是前两个有什么问题?
  • 我什至无法理解描述。它应该不那么模棱两可,并提供示例。
  • 顺便说一句,据我所知,您的表达式中的所有方括号都是多余的。
  • @EllenPage 我不明白为什么153 394 111943 293 492 无效。它们匹配“3 个数字字符(不带前导 0 的数字)后跟 3 个数字字符(数字)和 3 个数字字符(数字),由单个空格分隔。”

标签: java regex


【解决方案1】:

这是一个建议:

\b(1[0-4][1-9]|[1-9]\d) \d{3} \d{3}\b|150 000 000

匹配:

11 304 982
39 683 234
139 920 393
150 000 000

并排除:

153 349 111
053 394 111
3 394 234
89 909 98

说明

\b([1-9]\d|1[0-4][1-9]):以10149 之间的数字开头

\d{3}:后跟一个空格和 3 位数字

\d{3}\b:再次

|150 000 000:为了接受值150 000 000

请注意,我只接受字符 ,而不接受所有空格。您可能想将所有 更改为\s,这取决于您的需要。

Test it on regex101

【讨论】:

  • @EllenPage 因为第一个字符只接受[1-9],所以会排除053 934 111。检查regex101 链接。 :)
  • 对不起。我的意思是说这不排除“153 934 111”
  • @EllenPage 是的,它没有。但为什么应该呢?为什么153 834 111 无效?这是什么规矩?根据你的描述,我理解不同。
  • 很抱歉,我忘了添加一条位于作业底部的信息,我一开始没有看到。 “任何小于 10 000 000 或 >150 000 000 的数字都是无效的。”很抱歉浪费了您的时间。
【解决方案2】:

您可以使用^(?:(?:1[0-4]|[1-9])\d \d{3} \d{3}|150 000 000)$ 来检查您的身份号码。请注意,如果您将其与 .matches 函数一起使用并且必须在 java 字符串文字中使用双反斜杠,则可以省略锚点。

(?:1[0-4]|[1-9])\d 检查以 1-9 开头的 2 位数字(0 无效)或以 10-14 开头的 3 位数字以说明值限制。

遗憾的是,只有大于 150 000 000 的数字是无效的,所以 150 000 000 本身不是 - 因此最后一个交替。

另一种方法可能是检查整体格式(例如^[1-9]\d\d? \d{3} \d{3}$),然后删除空格并对最后一个限制进行常规数字检查。

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2013-10-12
    • 2023-02-26
    • 2011-11-12
    • 2021-06-20
    • 1970-01-01
    • 2019-04-14
    • 2014-12-21
    相关资源
    最近更新 更多