一个用于ISBN 13的正则表达式

5

大家好,我一直在尝试为我的.xsd文件创建一个用于XML的正则表达式。

这个表达式应该验证一个ISBN-13号码,但我只能得到如下进展:

ISBN (978|979)[ |-][0-9]{1,5}[ |-][0-9]{1,7}[ |-][0-9]{1,7}[0-9]{1}

如果有人填写正确的ISBN13,则这是可以的,但仍有可能制作比较长的ISBN(例如,仍然有可能使数字的第一个块为5位数,第二个块为7位数,第三个块也为7位数)。

我对这个主题非常陌生,无法解决这个问题,因此希望有人能帮助我或解决我的问题。

我知道ISBN 13由什么组成,我查阅了维基百科和其他网站,但我的实际问题是正则表达式本身。

希望这个问题之前没有被问过,如果有人先问过这个问题,我很抱歉。

3个回答

8
根据 http://regexlib.com/REDetails.aspx?regexp_id=1747 的正则表达式
ISBN(-1(?:(0)|3))?:?\x20+(?(1)(?(2)(?:(?=.{13}$)\d{1,5}([ -])\d{1,7}\3\d{1,6}\3(?:\d|x)$)|(?:(?=.{17}$)97(?:8|9)([ -])\d{1,5}\4\d{1,7}\4\d{1,6}\4\d$))|(?(.{13}$)(?:\d{1,5}([ -])\d{1,7}\5\d{1,6}\5(?:\d|x)$)|(?:(?=.{17}$)97(?:8|9)([ -])\d{1,5}\6\d{1,7}\6\d{1,6}\6\d$)))

此正则表达式可匹配旧版10位ISBN和新版13位ISBN。

您可以轻松(或许不是那么容易)使用您需要的部分正则表达式。


我在同一网页上也找到了这个解决方案,不幸的是它并不适用于我的XML和XSD。 - user534202
你对这个解决方案的确切问题是什么? - terminus
也许是因为我的正则表达式技能非常有限,所以我无法理解它是如何构建的,或者我如何从我的方法到达那里,我还想了解这个代码的作用,而不仅仅是复制粘贴。此外,我不必拥有ISBN10。该字段只能包含ISBN13。 - user534202
如果您不想要10位数字版本,那么dmnkhhn有一个更好的答案。 - terminus

4
ISBN(?:-13)?:?\x20*(?=.{17}$)97(?:8|9)([ -])\d{1,5}\1\d{1,7}\1\d{1,6}\1\d$

应该匹配:
ISBN-13:978-1-4028-9462-6
ISBN:978-1-4028-9462-6
ISBN-13 978-1-4028-9462-6
ISBN 978-1-4028-9462-6


我只是复制了这个代码来尝试,但是当ISBN出现错误后,XSD无法验证。也许我太蠢了,但这困扰了我一整天,有人能解释一下在这部分\x20*(?=.{17}$)97(?:8|9)中发生了什么吗? - user534202
如果我需要匹配不包含“ISBN”部分的模式,该怎么办? - Nano Taboada
只需删除 ISBN(?:-13)?:?\x20* 部分。 - dmnkhhn

2

另请参见xFront上的ISBN

我们已经为ISBN创建了一个XML Schema simpleType定义。这个ISBN定义涵盖了全球所有合法的ISBN格式。


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