Я нашел еще одну проблему, вызвавшую эту проблему, и уже решил ее. Я случайно сохранил свой скрипт в кодировке UTF-16
. Похоже, что PHP5 не может распознать тег <?php
в 16-битной кодировке по умолчанию.
Я согласен, что по определению ваше регулярное выражение не пропускает 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}}"
$UUID_RE = join '-', map { "[0-9a-z]{$_}" } 8, 4, 4, 4, 12;
BTW, разрешая только 4 на одной из позиций, действителен только для UUIDv4. Но v4 - не единственная версия UUID, которая существует. Я также встречал v1 в своей практике.
Вариант для 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];
В 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 ™!
ПРИМЕЧАНИЕ. Эти интервалы также будут соответствовать :;<=>?@'
, поэтому, если вы подозреваете, что могли бы дать вам ложные срабатывания, не используйте ярлык. (Спасибо, Оливер Обер, за то, что указали это в комментариях.)
Итак, я думаю, что у Ричарда Броноски на самом деле есть лучший ответ на сегодняшний день, но я думаю, вы можете сделать немного, чтобы сделать его несколько проще (или, по крайней мере, терре):
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
– Pedro Gimeno
12 May 2014 в 12:01
/^[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, хотя они действительны.
Если вы хотите проверить или проверить конкретную версию 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
a-f
рядом с каждой областью A-F
.
– Paweł Psztyć
26 June 2017 в 22:21
i
в конце регулярного выражения отмечает это как нечувствительное к регистру.
– johnhaley81
30 June 2017 в 03:00
Регулярное выражение для uuid:
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
[a-f0-9]
! Поскольку это шествие! Ваше регулярное выражение (как оно есть) может возвращать ложные срабатывания.
– exhuma
25 September 2011 в 10:21
Версии 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}/
(:?8|9|A|B)
, вероятно, немного читаем как [89aAbB]
– broofa
6 February 2013 в 20:26
i
(без учета регистра).
– Gajus
15 January 2014 в 01:11
@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:)
По определению, UUID - это 32 шестнадцатеричных цифры, разделенных в 5 группах дефисами, как вы описали. Вы не должны пропустить ни одного с вашим регулярным выражением.
Для 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}"
[\w]{8}(-[\w]{4}){3}-[\w]{12}
работал для меня в большинстве случаев.
Или если вы хотите быть действительно конкретным [\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.
\w
обычно означает «символы слова». Он будет соответствовать гораздо больше, чем шестнадцатеричные цифры. Ваше решение намного лучше. Или, для совместимости / удобочитаемости, вы можете использовать [a-f0-9]
– exhuma
25 September 2011 в 10:23
import re def valid_uuid(uuid): regex = re.compile('[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}', re.I) match = regex.match(uuid) return bool(match) valid_uuid('2wtu37k5-q174-4418-2cu2-276e4j82sv19')
– Tom Wojcik
1 December 2017 в 10:25