В этом руководстве по регулярным выражениям Java мы научимся использовать регулярные выражения для проверки того, ввел ли пользователь допустимый международный стандартный номер книги(ISBN).
1. Что такое действительный ISBN?
ISBN — это 13-значный(или 10-значный) номер, который однозначно идентифицирует книги и книжные продукты, изданные на международном уровне. Целью ISBN является установление и идентификация одного названия или издания названия от одного конкретного издателя, и он является уникальным для этого издания, что позволяет более эффективно продавать продукцию книготорговцам, библиотекам, университетам, оптовикам и дистрибьюторам.
Каждый ISBN состоит из тринадцати цифр(или 10 цифр), и всякий раз, когда он печатается, ему предшествуют буквы ISBN. Номер делится на четыре части переменной длины, каждая часть отделена дефисом.
Четыре части ISBN следующие:
- Идентификатор группы или страны, который определяет национальную или географическую группу издателей;
- Идентификатор издателя, который идентифицирует конкретного издателя в группе;
- Идентификатор заголовка, который идентифицирует конкретный заголовок или издание заголовка;
- Контрольная цифра — это одна цифра в конце ISBN, которая подтверждает подлинность ISBN.
Первоначальный 9-значный стандартный номер книги(SBN) не имел идентификатора регистрационной группы, но добавление нуля(0) в качестве префикса к 9-значному SBN создает действительный 10-значный ISBN.
Все нижеперечисленное можно считать примерами действительных номеров ISBN:
- 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
2. Регулярное выражение для проверки 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.
3. Пример Java для проверки только форматов ISBN-10
List<String> isbns = new ArrayList<String>();//Valid ISBNsisbns.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 ISBNsisbns.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:truetruetruetruefalsefalsefalsefalse
4. Программа Java для проверки только форматов ISBN-13
List<String> isbns = new ArrayList<String>();//Valid ISBNsisbns.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 ISBNsisbns.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:truetruetruetruefalsefalsefalsefalse
5. Проверьте форматы ISBN-10 и ISBN-13
List<String> isbns = new ArrayList<String>();//Valid ISBNsisbns.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 ISBNsisbns.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:truetruetruetruetruetruetruetruefalsefalsefalsefalsefalsefalsefalsefalse
Я посоветую вам поэкспериментировать с приведенным выше простым регулярным выражением, чтобы попробовать больше вариантов ISBN, и сообщите мне о ваших результатах.
Ссылки:
http://en.wikipedia.org/wiki/Международный_Стандартный_Номер_Книги
http://www.isbn.org/faqs_general_questions