【问题标题】:Regex for a permutation of exactly 7 digits and 2 hyphens, without 2 consecutive hyphens正则表达式,用于正好 7 个数字和 2 个连字符的排列,没有 2 个连续的连字符
【发布时间】:2021-01-27 15:48:39
【问题描述】:

我正在寻找一个正则表达式来匹配一个字符串,它应该:

  • 以数字开头
  • 'in-between' 有 7 个数字和 2 个连字符的排列,没有 2 个连续的连字符
  • 以数字、连字符、数字序列结尾

匹配:

  • 01-234-5678-9
  • 01234-56-78-9
  • 0123-4-5678-9
  • 012-345-678-9
  • 01-234567-8-9
  • 01-234-5678-9
  • 0-12345-678-9
  • 0-123-45678-9
  • 0-123-45678-9
  • 01-23456-78-9
  • 0-123456-78-9
  • 0-1234567-8-9

不匹配:

  • 01-234-56789-0
  • 01-234-567-8
  • 01--2345678-9
  • 01-2345678--9
  • 0-1-23456789
  • -01-2345678-9

目前,我还不太清楚如何匹配两个“中间”连字符:^\d\d{7}\d-\d$

编辑: 感谢我对这个问题的回答,我能够将其扩展到其他 question 关于 ISBN-10 和 ISBN-13...

【问题讨论】:

  • 为什么0-1-2345678-9 无效?
  • 我的错误,刚刚纠正...
  • @YaasineDM 我回滚了你的编辑。新问题得到新帖子。你不能回去用不同的条件改变你的 OP,这会使给定的答案无效。所以,请随意打开一个新帖子。
  • 谢谢@JvdV,我想知道该怎么做...我刚刚根据您的建议发布了一个新问题:stackoverflow.com/questions/65925071/…

标签: regex


【解决方案1】:

您可以断言 7 位数字和末尾的 digit - digit 部分。

对于匹配,连字符前后应至少有一个数字,以防止连续的连字符。

^\d(?=(?:-?\d){7}-?\d-\d$)\d*-\d+-\d*\d-\d$

  • ^ 字符串开始
  • \d 匹配单个数字
  • (?= 积极前瞻
    • (?:-?\d){7} 匹配由可选 - 分隔的 7 位数字
    • -?\d-\d$ 匹配可选的- 和末尾的\d-\d$
  • )关闭前瞻
  • \d*-\d+-\d*\d-\d 匹配所有连字符至少由一个数字分隔的可能格式
  • $ 字符串结束

Regex demo

【讨论】:

  • 非常感谢您的回答!我需要进一步研究积极的前瞻性......你帮了大忙......
  • 顺便说一句,我也用它来匹配非英语地区的 ISBN-10 或 13:^((97(8|9))*\d{9}|^(97(8|9)-)*(\d(?=(?:-?\d){7}-?\d-)\d*-\d+-\d*\d-)|^(97(8|9) )*(\d(?=(?: ?\d){7} ?\d )\d* \d+ \d*\d ))[\dx]$;匹配 9780123456789979-01-234-5678-x0123 4 5678 9。你认为它可以进一步简化吗?
【解决方案2】:

我的两分钱:

^(?=.{11}-\d$)(?:\d+-){3}\d

在线查看demo

  • ^ - 开始字符串锚点。
  • (?= - 打开积极的前瞻:
    • .{11}-\d$ - 除换行符以外的任何字符 11 次后跟连字符、单个数字和结束字符串锚点。
    • ) - 关闭正向前瞻。
  • (?: - 打开非捕获组:
    • \d+- - 1+ 数字后跟连字符。
    • ){3} - 关闭非捕获组并匹配 3 次。
  • \d - 匹配单个数字。

我想即使^(?=.{13}$)(?:\d+-){3}\d$ 也可以。

【讨论】:

  • 感谢您的回答,这似乎更简单...我尝试对其进行调整以匹配非英语地区的 ISBN-10 或 13:/^((97(8|9))*\d{9}|(97(8|9)-)*(?=.{11}-)(?:\d+-){3}|(97(8|9) )*(?=.{11} )(?:\d+ ){3})[\dx]$/i;匹配 9780123456789、979-01-234-5678-x 和 0123 4 5678 9. 你认为可以进一步简化吗?
  • 那我觉得你可以做到^(?=.{13}$)(?:\d+-){3}\d$nice ++
  • 我在最后一行@TheFourthBird 有一个替代方案,但我不确定哪一个会是“更好”的那个。感谢您的荣誉 =)
  • @Thefourthbird 我将相应地更新我的问题(使用正确的示例),但基本上:可选(ISBN-13)978979 前缀,后跟 10 位数字(ISBN-10),最后一个可能是x,其变体包括连字符或空格,具有与前面提到的相同的约束...
猜你喜欢
  • 1970-01-01
  • 2022-06-12
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多