【问题标题】:Use regex to verify an ISBN number使用正则表达式验证 ISBN 号
【发布时间】:2016-12-21 20:46:32
【问题描述】:

我需要一个正则表达式来验证用户输入的 ISBN 号。

ISBN 必须是一个字符串,仅包含: [10 or 13 digits] and hyphens

我尝试了^[\d*\-]{10}|[\d*\-]{13}$,但它不起作用。

我的正则表达式只匹配:978-1-56611-56619-901257561035

它应该返回以下结果:

"978-1-56619-909-4 2" => false
"978-1-56619-909-4" => true
"1-56619-909-3 " => false
"1-56619-909-3" => true
"isbn446877428ydh" => false
"55 65465 4513574" => false
"1257561035" => true
"1248752418865" => true

非常感谢任何帮助。

【问题讨论】:

  • 它不起作用 不是正确的问题描述。
  • 喜欢 asked here ?
  • 您无法使用正则表达式验证 ISBN。最后一位是checksum,需要计算。

标签: php regex isbn


【解决方案1】:

您可以将此正则表达式与积极的前瞻一起使用:

^(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$)[\d-]+$

RegEx Demo

(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$) 是一个正向前瞻,可确保我们在输入中有 10 或 13 位数字。

【讨论】:

  • 人们应该小心这个解决方案。它确实匹配 10 位或 13 位数字,但并非所有 10 位和 13 位数字都是 ISBN。例如。 978-0-306-40615-6 是 13 位数字,但不是有效的 ISBN
  • @anubhava:非常感谢。完美运行。答案将在 5 分钟后标记为已解决。
  • @GentlemanMax 是的,你是对的。这不能用于验证有效的 ISBN。但检查有效的 ISBN 格式很有用。
  • @LouisTran,我同意。只是想确保有人提到她,以防有人通过谷歌到达这里。
  • 虽然它超出了原始问题的范围,但请注意 ISBN 10 的校验位可以是“X”(代表“10”)。上面的 RegEx 非常好,只是没有考虑到这种可能性。我正在尝试利用@anubhava 的解决方案,但包括这个例外(我的 RegEx 能力很弱 - 这就是我在这里的原因!)。
【解决方案2】:

正如接受的答案所述,并非所有 10 位或 13 位数字都是有效的 ISBN。

一个 ISBN 由五组数字组成,每组数字是 13 位数字。 2007 年,该标准从 10 位数字转移。这五个组可以接受各种长度的数字,这使得 ISBN 难以验证。 参考。 https://en.wikipedia.org/wiki/International_Standard_Book_Number

一个解决方案是这样的: ^(?:ISBN(?:-13)?:?\ )?(?=[0-9]{13}$|(?=(?:[0-9]+[-\ ]){4})[-\ 0-9]{17}$)97[89][-\ ]?[0-9]{1,5}[-\ ]?[0-9]+[-\ ]?[0-9]+[-\ ]?[0-9]$ 来源:O'Reilly Regular Expressions Cookbook, 2nd edition

您可以在这里找到许多可能的 ISBN 验证正则表达式:https://regexlib.com/Search.aspx?k=ISBN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2019-02-26
    • 2016-12-09
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多