使用正则表达式验证ISBN号码

4
我需要一个正则表达式来验证用户输入的ISBN号码。
ISBN必须是一个只包含以下内容的字符串: [10或13位数字]和连字符 我尝试了^[\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

我非常感谢任何帮助。


“它不工作” 不是一个合适的问题描述。 - Sebastian Proske
3
就像在这里被问到的那样,是吗? - YvesLeBorg
3
无法使用正则表达式验证ISBN号码。最后一位数字是校验和,需要进行计算。 - TheGentleman
2个回答

7

您可以使用正向先行断言的正则表达式:

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

正则表达式演示

(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$) 是一个正向预查,用于确保输入中有10或13个数字。


7
使用这种解决方案时,人们应该注意。它确实匹配10或13位数字,但并不是所有的10位和13位数字都是ISBN号码。例如,978-0-306-40615-6是13位数字,但不是有效的ISBN。 - TheGentleman
1
@anubhava:非常感谢。完美地解决了问题。5分钟后回答将被标记为已解决。 - Louis Tran
1
@GentlemanMax 是的,你说得对。这不能用来验证有效的ISBN。但它可以用来检查有效的ISBN格式。 - Louis Tran
1
@LouisTran,我同意。只是想确保在这里提到它,以防有人通过谷歌找到这里。 - TheGentleman
4
尽管这超出了原问题的范围,但需要注意的是,ISBN 10的校验位可以是“X”(代表“10”)。上面的正则表达式非常好,但它没有考虑到这种可能性。我正在尝试利用@anubhava的解决方案,但包括这个异常(我的正则表达式能力很弱 - 这就是为什么我来这里!)。 - Greg M
显示剩余4条评论

6

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

一个ISBN由五组数字组成,共13位。2007年,标准从10位数字转变为13位数字。这五组可以接受各种长度的数字,这使得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, 第2版

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


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