Я ищу UUID в блоках текста с помощью регулярных выражений. В настоящее время я полагаюсь на предположение, что все UUID будут следовать шаблонам из 8-4-4-4-12 шестнадцатеричных цифр.
Кто-нибудь может вспомнить случай использования, когда это предположение было бы неверным и заставило бы меня пропустить некоторые UUID?
Ответы:
Я согласен, что по определению ваше регулярное выражение не пропускает ни одного UUID. Однако может быть полезно отметить, что если вы ищете специально для глобальных уникальных идентификаторов (GUID) от Microsoft, есть пять эквивалентных строковых представлений для GUID:
источник
Регулярное выражение для uuid:
источник
[a-f0-9]
! Как это шестнадцатеричное! Ваше регулярное выражение (как оно есть) может возвращать ложные срабатывания.@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}
Только что прокомментировал это, но не достаточно репутации :)
источник
/.../i
Версия не сделал.источник: http://en.wikipedia.org/wiki/Uuid#Definition
Следовательно, это технически более правильно:
источник
(:?8|9|A|B)
, вероятно, немного более читабельным, как[89aAbB]
i
(без учета регистра) флаг.Если вы хотите проверить или проверить конкретную версию UUID , вот соответствующие регулярные выражения.
Номер версии является первым символом третьей группы
[VERSION_NUMBER][0-9A-F]{3}
:UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
источник
a-f
рядом с каждойA-F
областью действия.i
в конце регулярного выражения помечает его как нечувствительный к регистру.format
модификатор, установив его в «uuid» вместо использования регулярного выражения для тестирования UUID: swagger.io/docs/specification/data-models/data-types/#formatРегулярное выражение Gajus отклоняет UUID V1-3 и 5, даже если они действительны.
источник
[\w]{8}(-[\w]{4}){3}-[\w]{12}
работал для меня в большинстве случаев.Или если вы хотите быть действительно конкретным
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.источник
\w
обычно означает «символы слова». Это будет намного больше, чем шестнадцатеричные цифры. Ваше решение намного лучше. Или, для совместимости / читабельности вы можете использовать[a-f0-9]
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')
В python re, вы можете перейти от цифр до букв верхнего регистра. Так..
Это делает простейшее регулярное выражение Python UUID:
Я оставлю это в качестве упражнения для читателя, чтобы использовать timeit для сравнения их производительности.
Наслаждаться. Держите это Pythonic ™!
ПРИМЕЧАНИЕ. Эти промежутки также будут совпадать,
:;<=>?@'
поэтому, если вы подозреваете, что это может дать вам ложные срабатывания, не используйте ярлык. (Спасибо, Оливер Обер, за то, что указал на это в комментариях.)источник
По определению UUID - это 32 шестнадцатеричные цифры, разделенные на 5 групп дефисами, как вы уже описали. Вы не должны пропустить ни одного со своим регулярным выражением лица.
http://en.wikipedia.org/wiki/Uuid#Definition
источник
Итак, я думаю, что Ричард Броноски на самом деле имеет лучший ответ на сегодняшний день, но я думаю, что вы можете сделать немного, чтобы сделать его несколько проще (или, по крайней мере, более кратким):
источник
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Вариант для C ++:
источник
Для UUID, сгенерированного в OS X с
uuidgen
, шаблон регулярного выраженияПроверить с помощью
источник
Кстати, разрешение только 4 на одну из позиций действительно только для UUIDv4. Но v4 не единственная версия UUID, которая существует. Я встречал v1 в своей практике.
источник
Если вы используете Posix Regex (
grep -E
, MySQL и т. Д.), Это может быть проще для чтения и запоминания:источник
Для Баш:
Например:
источник