Используйте регулярное выражение для проверки номера 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

Я очень ценю любую помощь.


person Louis Tran    schedule 21.12.2016    source источник
comment
это не работает не является правильным описанием проблемы.   -  person Sebastian Proske    schedule 21.12.2016
comment
как было задано здесь?   -  person YvesLeBorg    schedule 21.12.2016
comment
Вы не можете проверить ISBN с помощью регулярного выражения. Последняя цифра — это контрольная сумма, которую необходимо вычислить.   -  person TheGentleman    schedule 21.12.2016


Ответы (2)


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

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

Демо RegEx

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

person anubhava    schedule 21.12.2016
comment
Люди должны быть осторожны с этим решением. Он соответствует 10- или 13-значным номерам, но не все 10- и 13-значные номера имеют ISBN. Например. 978-0-306-40615-6 состоит из 13 цифр, но не является действительным ISBN. - person TheGentleman; 21.12.2016
comment
@anubhava: Большое спасибо. Работает отлично. Ответ будет помечен как Решенный через 5 минут. - person Louis Tran; 21.12.2016
comment
@GentlemanMax Да, ты прав. Это нельзя использовать для проверки действительного ISBN. Но полезно проверить допустимый формат ISBN. - person Louis Tran; 21.12.2016
comment
@LouisTran, я согласен. Просто хотел убедиться, что она была упомянута на случай, если кто-то попадет сюда через Google в будущем. - person TheGentleman; 22.12.2016
comment
Хотя это выходит за рамки исходного вопроса, в качестве примечания ISBN 10 может иметь контрольную цифру «X» (обозначающую «10»). Вышеприведенный RegEx очень хорош, за исключением того, что он не учитывает эту возможность. Я пытаюсь использовать решение @anubhava, но включаю это исключение (мои возможности RegEx слабы - вот почему я здесь!). - person Greg M; 28.07.2019
comment
Не могли бы вы привести примеры этих номеров ISBN? - person anubhava; 28.07.2019
comment
Это действительный ISBN, который не соответствует вашему коду @anubhava: 3-04-013341-X. - person samthebrand; 02.10.2020
comment
@samthebrand Мой ответ основан на этом утверждении из OP ISBN must be a string contains only: [10 or 13 digits] and hyphens - person anubhava; 02.10.2020

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

ISBN состоит из пяти групп номеров, которые составляют 13 цифр. В 2007 году стандарт перешел с 10 цифр. Пять групп могут принимать номера различной длины, что затрудняет проверку ISBN. Ссылка https://en.wikipedia.org/wiki/Международный_стандартный_номер_книги

Одно из решений таково: ^(?: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 Поваренная книга по выражениям, 2-е издание

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

person Thor Hovden    schedule 17.07.2020