Как проверить действительный UUID / GUID? - PullRequest
212 голосов
/ 26 октября 2011

Как проверить, содержит ли переменная действительный идентификатор UUID / GUID?

В настоящее время меня интересует только проверка типов 1 и 4, но это не предел для вашего ответа.

Ответы [ 9 ]

345 голосов
/ 01 декабря 2012

В настоящее время UUID соответствуют требованиям, указанным в RFC4122.

Поэтому для проверки UUID ...

/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i

... убедитесь, что у вас есть канонически отформатированный UUID от версии 1 до5 и является соответствующим вариантом согласно RFC4122.

ПРИМЕЧАНИЕ: фигурные скобки { и } не являются каноническими.Они являются артефактом некоторых систем и способов их использования.

Легко изменить приведенное выше регулярное выражение в соответствии с требованиями исходного вопроса.

СОВЕТ: регулярное выражение группы / захватывает

55 голосов
/ 26 октября 2011

регулярное выражение в помощь

/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test('01234567-9ABC-DEF0-1234-56789ABCDEF0');

или с скобками

/^\{?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}‌​\}?$/
27 голосов
/ 07 августа 2014

Если вы используете Node.js для разработки, рекомендуется использовать пакет под названием Validator. Он включает все регулярные выражения, необходимые для проверки различных версий UUID, плюс вы получаете различные другие функции для проверки.

Вот ссылка npm: Validator

var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
25 голосов
/ 04 июля 2016

Если вы хотите проверить или проверить конкретную версию UUID, вот соответствующие регулярные выражения.

Обратите внимание, что единственное отличие - это номер версии , который объясняется в4.1.3. Version глава UUID 4122 RFC .

Номер версии является первым символом третьей группы: [VERSION_NUMBER][0-9A-F]{3}:

  • UUID v1:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
    
  • UUID v2:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[2][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
    
  • UUID v3:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
    
  • UUID v4:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
    
  • UUID v5:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
    
12 голосов
/ 20 апреля 2015

Кроме ответа Гамбола , который будет выполнять работу почти во всех случаях , все ответы, данные до сих пор пропущены, что групповое форматирование (8-4-4-4-12) Не обязательно кодировать GUID в тексте . Он используется очень часто, но, очевидно, допустима также простая цепочка из 32 шестнадцатеричных цифр. [1] регулярное выражение усиление :

/^[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i

[1] Вопрос касается check ing variable s, поэтому мы должны включить также недружественную пользователю форму.

9 голосов
/ 25 апреля 2016

Все опубликованные до настоящего времени регулярные выражения для конкретного типа не выполняются по нулевому UUID типа 0, определенному в 4.1.7 RFC как:

nil UUID - это специальная форма UUID, для которой заданы все 128 битов равными нулю: 00000000-0000-0000-0000-000000000000

Чтобы изменить ответ Вольфа:

/^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-5][0-9a-f]{3}-?[089ab][0-9a-f]{3}-?[0-9a-f]{12}$/i

Или, чтобы правильно исключить «тип 0» без всех нулей, мы имеем следующее (спасибо Люку):

/^(?:[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a‌​-f]{3}-?[0-9a-f]{12}‌​|00000000-0000-0000-‌​0000-000000000000)$/‌​i
2 голосов
/ 21 июля 2017

Небольшой метод, чтобы проверить, является ли String UUID.

public boolean isUUID(String s){
    return s.matches("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
}
1 голос
/ 13 марта 2019

благодаря @usertatha с некоторыми изменениями

function isUUID ( uuid ) {
    let s = "" + uuid;

    s = s.match('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$');
    if (s === null) {
      return false;
    }
    return true;
}

0 голосов
/ 25 марта 2019

Я думаю, что лучше использовать статический метод fromString, чтобы избежать этих регулярных выражений.

    id = UUID.randomUUID();
    UUID uuid = UUID.fromString(id.toString());
    Assert.assertEquals(id.toString(), uuid.toString());

С другой стороны

   UUID uuidFalse = UUID.fromString("x");

выдает java.lang.IllegalArgumentException: неверная строка UUID: x

...