# 验证 ISBN（国际标准书号）的 Java 正则表达式

> 原文： [https://howtodoinjava.com/regex/java-regex-validate-international-standard-book-number-isbns/](https://howtodoinjava.com/regex/java-regex-validate-international-standard-book-number-isbns/)

在此 Java 正则表达式教程中，我们将学习使用正则表达式来测试用户是否输入了有效的国际标准书号（ISBN）。

## 有效的国际标准书号（ISBN）

国际标准书号（ISBN）是一个 13 位（或 10 位也是如此）的编号，用于唯一标识国际上出版的书籍和类书籍产品。 ISBN 的目的是从一个特定的出版商那里建立和识别一个书名或一个书名版本，并且该版本是唯一的，从而允许书商，图书馆，大学，批发商和发行商更有效地营销产品。

每个 ISBN 均由 13 位数字（或 10 位数字）组成，并且每打印一次它都在字母 ISBN 之前。 该数字分为可变长度的四个部分，每个部分之间用连字符分隔。

ISBN 的四个部分如下：

*   标识发布者的国家或地区分组的组或国家/地区标识符；
*   发布者标识符，用于标识组中的特定发布者；
*   标题标识符，用于标识特定标题或标题版本；
*   校验位是用于验证 ISBN 的 ISBN 末尾的一位数字。

原始的 9 位标准书号（SBN）没有注册组标识符，但是将零（0）作为 9 位 SBN 的前缀会创建一个有效的 10 位 ISBN。

以下所有内容均可以视为有效的 ISBN 的示例：

```java
ISBN 978-0-596-52068-7
ISBN-13: 978-0-596-52068-7
978 0 596 52068 7
9780596520687
ISBN-10 0-596-52068- 9
0-596-52068-9
```

## 验证 ISBN 的正则表达式

为了验证 ISBN，我们的正则表达式为：

> ISBN-10 的正则表达式：`^(?:ISBN(?:-10)?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$)[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$`

> ISBN-13 的正则表达式：`^(?:ISBN(?:-13)?:? )?(?=[0-9]{13}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)97[89][- ]?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9]$`

> ISBN-10 或 ISBN-13 的正则表达式：`^(?:ISBN(?:-1[03])?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$`

注意：您不能仅使用正则表达式来验证 ISBN，因为最后一位是使用校验和算法计算的。 本节中的正则表达式仅验证 ISBN 的格式。

现在，我们使用一些演示 ISBN 编号测试我们的 ISBN 正则表达式。

## 仅验证 ISBN-10 格式

```java
List<String> isbns = new ArrayList<String>();

//Valid ISBNs
isbns.add("0-596-52068-9");  
isbns.add("0 512 52068 9");  
isbns.add("ISBN-10 0-596-52068-9");
isbns.add("ISBN-10: 0-596-52068-9");

//Invalid ISBNs
isbns.add("0-5961-52068-9");  
isbns.add("11 5122 52068 9");  
isbns.add("ISBN-13 0-596-52068-9");
isbns.add("ISBN-10- 0-596-52068-9");

String regex = "^(?:ISBN(?:-10)?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$)[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$";

Pattern pattern = Pattern.compile(regex);

for (String isbn : isbns)
{
	Matcher matcher = pattern.matcher(isbn);
	System.out.println(matcher.matches());
}

Output:

true
true
true
true

false
false
false
false

```

## 仅验证 ISBN-13 格式

```java
List<String> isbns = new ArrayList<String>();

//Valid ISBNs
isbns.add("ISBN 978-0-596-52068-7");  
isbns.add("ISBN-13: 978-0-596-52068-7");  
isbns.add("978 0 596 52068 7");
isbns.add("9780596520687");

//Invalid ISBNs
isbns.add("ISBN 11978-0-596-52068-7");  
isbns.add("ISBN-12: 978-0-596-52068-7");  
isbns.add("978 10 596 52068 7");
isbns.add("119780596520687");

String regex = "^(?:ISBN(?:-13)?:? )?(?=[0-9]{13}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)97[89][- ]?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9]$";

Pattern pattern = Pattern.compile(regex);

for (String isbn : isbns)
{
	Matcher matcher = pattern.matcher(isbn);
	System.out.println(matcher.matches());
}

Output:

true
true
true
true

false
false
false
false

```

## 同时验证 ISBN-10 和 ISBN-13 格式

```java
List<String> isbns = new ArrayList<String>();

//Valid ISBNs
isbns.add("ISBN 978-0-596-52068-7");  
isbns.add("ISBN-13: 978-0-596-52068-7");  
isbns.add("978 0 596 52068 7");
isbns.add("9780596520687");
isbns.add("0-596-52068-9");  
isbns.add("0 512 52068 9");  
isbns.add("ISBN-10 0-596-52068-9");
isbns.add("ISBN-10: 0-596-52068-9");

//Invalid ISBNs
isbns.add("ISBN 11978-0-596-52068-7");  
isbns.add("ISBN-12: 978-0-596-52068-7");  
isbns.add("978 10 596 52068 7");
isbns.add("119780596520687");
isbns.add("0-5961-52068-9");  
isbns.add("11 5122 52068 9");  
isbns.add("ISBN-11 0-596-52068-9");
isbns.add("ISBN-10- 0-596-52068-9");

String regex = "^(?:ISBN(?:-1[03])?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$";

Pattern pattern = Pattern.compile(regex);

for (String isbn : isbns)
{
	Matcher matcher = pattern.matcher(isbn);
	System.out.println(matcher.matches());
}

Output:

true
true
true
true
true
true
true
true

false
false
false
false
false
false
false
false

```

我建议您使用上述简单的正则表达式尝试更多的 ISBN 变体，并让我知道您的发现。

**祝您学习愉快！**

**参考：**

[http://en.wikipedia.org/wiki/International_Standard_Book_Number](https://en.wikipedia.org/wiki/International_Standard_Book_Number "isbn")

[http://www.isbn.org/faqs_general_questions](http://www.isbn.org/faqs_general_questions "isbn")