Проверка регулярных выражений для буквенно-цифровых символов и длины между '-' [duplicate]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

Обратный вызов ...args завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

149
задан Guy 30 October 2014 в 22:27
поделиться

13 ответов

Я согласен, что по определению ваше регулярное выражение не пропускает UUID. Однако может быть полезно отметить, что если вы ищете особенно глобальные уникальные идентификаторы Microsoft (GUID), существует пять эквивалентных строковых представлений для GUID:

"ca761232ed4211cebacd00aa0057b223" 

"CA761232-ED42-11CE-BACD-00AA0057B223" 

"{CA761232-ED42-11CE-BACD-00AA0057B223}" 

"(CA761232-ED42-11CE-BACD-00AA0057B223)" 

"{0xCA761232, 0xED42, 0x11CE, {0xBA, 0xCD, 0x00, 0xAA, 0x00, 0x57, 0xB2, 0x23}}" 
32
ответ дан Panos 31 August 2018 в 20:32
поделиться
$UUID_RE = join '-', map { "[0-9a-z]{$_}" } 8, 4, 4, 4, 12;

BTW, разрешая только 4 на одной из позиций, действителен только для UUIDv4. Но v4 - не единственная версия UUID, которая существует. Я также встречал v1 в своей практике.

1
ответ дан abufct 31 August 2018 в 20:32
поделиться

Вариант для C ++:

#include <regex>  // Required include

...

// Source string    
std::wstring srcStr = L"String with GIUD: {4d36e96e-e325-11ce-bfc1-08002be10318} any text";

// Regex and match
std::wsmatch match;
std::wregex rx(L"(\\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\\})", std::regex_constants::icase);

// Search
std::regex_search(srcStr, match, rx);

// Result
std::wstring strGUID       = match[1];
4
ответ дан Anton K 31 August 2018 в 20:32
поделиться

В python re вы можете перейти от номера к альфа-букве верхнего регистра. Итак.

import re
test = "01234ABCDEFGHIJKabcdefghijk01234abcdefghijkABCDEFGHIJK"
re.compile(r'[0-f]+').findall(test) # Bad: matches all uppercase alpha chars
## ['01234ABCDEFGHIJKabcdef', '01234abcdef', 'ABCDEFGHIJK']
re.compile(r'[0-F]+').findall(test) # Partial: does not match lowercase hex chars
## ['01234ABCDEF', '01234', 'ABCDEF']
re.compile(r'[0-F]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-f]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-Fa-f]+').findall(test) # Good (with uppercase-only magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-9a-fA-F]+').findall(test) # Good (with no magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']

Это делает простейшее регулярное выражение UUID Python:

re_uuid = re.compile("[0-F]{8}-([0-F]{4}-){3}[0-F]{12}", re.I)

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

Наслаждайтесь. Сохраните его Pythonic ™!

ПРИМЕЧАНИЕ. Эти интервалы также будут соответствовать :;<=>?@', поэтому, если вы подозреваете, что могли бы дать вам ложные срабатывания, не используйте ярлык. (Спасибо, Оливер Обер, за то, что указали это в комментариях.)

9
ответ дан Bruno Bronosky 31 August 2018 в 20:32
поделиться

Итак, я думаю, что у Ричарда Броноски на самом деле есть лучший ответ на сегодняшний день, но я думаю, вы можете сделать немного, чтобы сделать его несколько проще (или, по крайней мере, терре):

re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)
4
ответ дан ifischer 31 August 2018 в 20:32
поделиться
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89AB][0-9a-f]{3}-[0-9a-f]{12}$/i

Регулярное выражение Gajus отклоняет UUID V1-3 и 5, хотя они действительны.

27
ответ дан iGEL 31 August 2018 в 20:32
поделиться

Если вы хотите проверить или проверить конкретную версию 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
    
47
ответ дан Ivan Gabriele 31 August 2018 в 20:32
поделиться

Регулярное выражение для uuid:

[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
353
ответ дан Ivelin 31 August 2018 в 20:32
поделиться

Версии 4 UUID имеют форму xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, где x - любая шестнадцатеричная цифра, а y - одна из 8, 9, A или B. например. f47ac10b-58cc-4372-a567-0e02b2c3d479.

source: http://en.wikipedia.org/wiki/Uuid#Definition

Поэтому это технически более корректно:

/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/
87
ответ дан Matt Keeble 31 August 2018 в 20:32
поделиться

@ivelin: UUID может иметь капители. Таким образом, вам понадобится toLowerCase () строка или использовать:

[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}

Хотелось бы просто прокомментировать это, но не достаточно rep:)

93
ответ дан Matthew F. Robben 31 August 2018 в 20:32
поделиться

По определению, UUID - это 32 шестнадцатеричных цифры, разделенных в 5 группах дефисами, как вы описали. Вы не должны пропустить ни одного с вашим регулярным выражением.

http://en.wikipedia.org/wiki/Uuid#Definition

9
ответ дан pix0r 31 August 2018 в 20:32
поделиться

Для UUID, сгенерированного в OS X с uuidgen, шаблон регулярного выражения -

[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}

Проверить с помощью

uuidgen | grep -E "[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}"
4
ответ дан Quanlong 31 August 2018 в 20:32
поделиться

[\w]{8}(-[\w]{4}){3}-[\w]{12} работал для меня в большинстве случаев.

Или если вы хотите быть действительно конкретным [\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}.

13
ответ дан Whymarrh 31 August 2018 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: