Regex 正则表达式,用于正好包含7个数字和2个连字符的排列,不包含2个连续连字符

Regex 正则表达式,用于正好包含7个数字和2个连字符的排列,不包含2个连续连字符,regex,Regex,我正在寻找与字符串匹配的正则表达式,该字符串应: 从一个数字开始 “中间”具有正好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

我正在寻找与字符串匹配的正则表达式,该字符串应:

  • 从一个数字开始
  • “中间”具有正好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
目前,我还不太清楚如何匹配2个中间连字符:
^\d\d{7}\d-\d$

编辑:
多亏了我对这个问题的回答,我能够将它扩展到关于ISBN-10和ISBN-13的另一个问题…

您可以断言7个数字和结尾的
数字部分

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

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

  • ^
    字符串的开头
  • \d
    匹配单个数字
  • (?=
    正向前瞻
    • (?:-?\d){7}
      匹配由可选
      -
      分隔的7位数字
    • -?\d-\d$
      匹配可选的
      -
      和末尾的
      \d-\d$
  • 关闭“向前看”
  • \d*-\d+-\d*\d-\d
    匹配所有连字符至少由一个数字分隔的可能格式
  • $
    字符串结尾
我的两分钱:

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

  • ^
    -启动字符串锚定
  • (?=
    -打开正向前瞻:
    • {11}-\d$
      -除换行符以外的任何字符,11次后跟一个hypen、一个数字和结束字符串锚定符
    • -关闭正向前瞻
  • (?:
    -打开非捕获组:
    • \d+-
      -1+位后跟连字符
    • ){3}
      -关闭非捕获组并匹配三次
  • \d
    -匹配单个数字

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

为什么
0-1-2345678-9
无效?我的错误刚刚更正…@YaasineDM我回滚了您的编辑。新问题得到新帖子。你不能用不同的条件改变你的OP,这会使给出的答案无效。所以,请随意打开一个新帖子。谢谢@JvdV,我想知道怎么做。。。根据你的建议,我刚刚发布了一个新问题:非常感谢你的回答!我需要进一步积极地向前看。。。你帮了大忙……顺便说一句,我也用这个来匹配非英语区的ISBN-10或13:
^(97(8(9))*\d{9}^(97(8(9)-)*(\d(?=(?:-?\d){7}-?\d-\d*-\d*-\d+\d*-\d*-\d^(97(8(9))*(\d=(((?:?:?:?\d){7}\d*\d))\d*\d]-\d*\d]-\d*\d*\d*.[\d]-\dxcode];匹配
9780123456789
979-01-234-5678-x
0123 4 5678 9
。你认为可以进一步简化吗?谢谢你的回答,看起来更简单。。。我试着调整它,使之与非英语地区的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)
978
979
前缀,后跟10位数字(ISBN-10),最后一位可能是
x
,变量包括连字符或空格,约束条件与前面提到的相同。。。