Ich suche nach UUIDs in Textblöcken mit einem regulären Ausdruck. Derzeit gehe ich davon aus, dass alle UUIDs einem Muster von 8-4-4-4-12 hexadezimalen Ziffern folgen.
Kann sich jemand einen Anwendungsfall vorstellen, bei dem diese Annahme ungültig wäre und dazu führen würde, dass ich einige UUIDs verpasse?
Antworten:
Ich bin damit einverstanden, dass Ihre Regex per Definition keine UUID übersieht. Es kann jedoch hilfreich sein zu beachten, dass es bei der Suche nach GUIDs (Global Unique Identifiers) von Microsoft fünf äquivalente Zeichenfolgendarstellungen für eine GUID gibt:
quelle
Der reguläre Ausdruck für uuid lautet:
quelle
[a-f0-9]
! Da ist es hex! Ihr Regex (so wie er ist) könnte falsch positive Ergebnisse zurückgeben.@ivelin: UUID kann Großbuchstaben haben. Sie müssen also entweder den String toLowerCase () verwenden oder Folgendes verwenden:
[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}
Hätte das nur kommentiert aber nicht genug rep :)
quelle
/.../i
Version hat nicht.Quelle: http://en.wikipedia.org/wiki/Uuid#Definition
Daher ist dies technisch korrekter:
quelle
(:?8|9|A|B)
ist wahrscheinlich etwas besser lesbar als[89aAbB]
i
Flag (ohne Berücksichtigung der Groß- und Kleinschreibung).Wenn Sie eine bestimmte UUID-Version überprüfen oder validieren möchten , finden Sie hier die entsprechenden regulären Ausdrücke.
Die Versionsnummer ist das erste Zeichen der dritten Gruppe
[VERSION_NUMBER][0-9A-F]{3}
::UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
quelle
a-f
neben jedemA-F
Bereich auch enthalten .i
am Ende des regulären Ausdrucks wird als Groß- und Kleinschreibung nicht berücksichtigt.format
Modifikator lieber verwenden, indem Sie ihn auf "uuid" setzen, anstatt einen regulären AusdruckGajus 'regulärer Ausdruck lehnt UUID V1-3 und 5 ab, obwohl sie gültig sind.
quelle
[\w]{8}(-[\w]{4}){3}-[\w]{12}
hat in den meisten Fällen für mich gearbeitet.Oder wenn Sie wirklich spezifisch sein wollen
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.quelle
\w
bedeutet normalerweise "Wortzeichen". Es stimmt viel mehr als mit Hex-Ziffern überein. Ihre Lösung ist viel besser. Oder für Kompatibilität / Lesbarkeit könnten Sie verwenden[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')
In Python Re können Sie von numerischen bis zu Großbuchstaben Alpha wechseln. So..
Das macht den einfachsten Python-UUID-Regex:
Ich überlasse es dem Leser als Übung, timeit zu verwenden, um die Leistung dieser zu vergleichen.
Genießen. Behalte es Pythonic ™!
HINWEIS: Diese Bereiche stimmen auch überein
:;<=>?@'
. Wenn Sie den Verdacht haben, dass dies zu falsch positiven Ergebnissen führen könnte, verwenden Sie nicht die Verknüpfung. (Vielen Dank an Oliver Aubert, der in den Kommentaren darauf hingewiesen hat.)quelle
Per Definition besteht eine UUID aus 32 hexadezimalen Ziffern, die wie beschrieben in 5 Gruppen durch Bindestriche getrennt sind. Sie sollten keine mit Ihrem regulären Ausdruck verpassen.
http://en.wikipedia.org/wiki/Uuid#Definition
quelle
Ich denke, Richard Bronosky hat tatsächlich die bisher beste Antwort, aber ich denke, Sie können ein wenig tun, um es etwas einfacher (oder zumindest kürzer) zu machen:
quelle
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Variante für C ++:
quelle
Für UUID, die unter OS X mit generiert wurde
uuidgen
, lautet das Regex-MusterÜberprüfen Sie mit
quelle
Übrigens, nur 4 auf einer der Positionen zuzulassen, gilt nur für UUIDv4. V4 ist jedoch nicht die einzige existierende UUID-Version. Ich habe v1 auch in meiner Praxis getroffen.
quelle
Wenn Sie Posix Regex (
grep -E
, MySQL usw.) verwenden, ist dies möglicherweise einfacher zu lesen und zu merken:quelle
Für Bash:
Beispielsweise:
quelle