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

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

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

Ответ 1

В настоящее время UUID соответствуют указанным в RFC4122. Часто игнорируемым краевым регистром является NIL UUID, как указано здесь. Следующее регулярное выражение учитывает это и возвращает совпадение для NIL UUID. См. ниже UUID, который принимает только не-NIL UUID. Оба эти решения предназначены для версий с 1 по 5 (см. первый символ третьего блока).

Поэтому, чтобы проверить UUID...

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

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

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

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

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

Чтобы избежать совпадения с NIL 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

Ответ 2

regex на помощь

/^[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}‌​\}?$/

Ответ 3

Если вы используете 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

Ответ 4

Если вы хотите проверить или проверить конкретную версию 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
    

Ответ 5

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

/^[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] Вопрос о проверке переменных, поэтому мы должны включить и недружественную форму пользователя.

Ответ 6

Все опубликованные до сих пор регулярные выражения, зависящие от типа, терпят неудачу в Nil 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

Ответ 7

спасибо @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;
}

Ответ 8

Небольшой метод проверки, является ли 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}$");
}

Ответ 9

Для Java, вот решение с использованием встроенной библиотеки UUID:

public Boolean isUUID(String id) {
    try {
        UUID.fromString(id).toString().equals(id);
        return true;
    } catch (IllegalArgumentException | NullPointerException ex) {
        return false;
    }
}

Ответ 10

Я думаю, что лучше использовать статический метод 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

Ответ 11

Я знаю, что это просили несколько лет, но для тех, кто увидит ответ, это мое предложение. Скорее используйте этот синтаксис ([0-9a-f\-]{36})*. Он просто проверяет UUID.