Используйте регулярное выражение для проверки номера ISBN

Мне нужно регулярное выражение для проверки номера ISBN, введенного пользователем.

ISBN должен быть строкой, содержащей только:[10 or 13 digits] and hyphens

Я старался ^[\d*\-]{10}|[\d*\-]{13}$ но это не работает

Мое регулярное выражение соответствует только: 978-1-5661, 1-56619-90, 1257561035

Он должен вернуть результаты ниже:

"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

Я действительно ценю любую помощь.

1 ответ

Решение

Вы можете использовать это регулярное выражение с положительным взглядом:

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

RegEx Demo

(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$) является положительным прогнозом, который гарантирует, что у нас есть 10 или 13 цифр на входе.

Как упоминалось в принятом ответе, не все 10- или 13-значные числа являются действительными ISBN.

ISBN состоит из пяти групп чисел, состоящих из 13 цифр. В 2007 году стандарт перешел с 10 цифр. Эти пять групп могут принимать номера различной длины, что затрудняет проверку ISBN. Ref. 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]$Источник: Поваренная книга регулярных выражений О'Рейли, 2-е издание.

Вы можете найти множество возможных регулярных выражений для проверки ISBN здесь: https://regexlib.com/Search.aspx?k=ISBN

Другие вопросы по тегам