Das Identifizieren einer bestimmten Zeichenfolge erfolgt im Hex-Farbformat

78

Ich suche nach einem regulären Ausdruck zum Überprüfen von Hex-Farben in ASP.NET C # und
suche auch nach Code für die Überprüfung auf der Serverseite.

Zum Beispiel: #CCCCCC

Avinash
quelle

Antworten:

166
^#(?:[0-9a-fA-F]{3}){1,2}$

Präparation:

^              anchor for start of string
#              the literal #
(              start of group
 ?:            indicate a non-capturing group that doesn't generate backreferences
 [0-9a-fA-F]   hexadecimal digit
 {3}           three times
)              end of group
{1,2}          repeat either once or twice
$              anchor for end of string

Dies entspricht einem beliebigen hexadezimalen Farbwert, der in CSS verwendet werden kann, z. B. #91bf4aoder #f13.

Hinweis: RGBA-Hex-Farbwerte werden jedoch nicht unterstützt.

Joey
quelle
1
Ich dachte, die gültige Farbe wäre 3 * eine 1/2 Kombination ... also / ^ # (?: [0-9a-fA-F] {1,2}) {3} $ / Beide Möglichkeiten scheinen zu funktionieren.
Michael Dausmann
4
@ MichaelDausmann: Nein, deine würde alles zwischen 3 und 6 hexadezimalen Ziffern akzeptieren.
Joey
1
@ Joey sehr hilfreich die Schritt für Schritt Erklärung. danke
Karim
Diese Regex ist sehr nützlich bei der Erstellung eines Beispielprogramms, das mein Unternehmen zum Einbinden neuer Entwickler verwendet. Als Perl-Programmierer der alten Schule war ich beeindruckt, dass einige jüngere Entwickler vorausschauende Aussagen in moderneren Programmiersprachen getroffen hatten. Nachdem ich den gleichen regulären Ausdruck in den Beiträgen einiger anderer Leute gesehen hatte, entschied ich mich schließlich, ihn zu googeln und zu sehen, dass sie gerade herausgefunden haben, wie man SO 😅 sucht
Vince
15

Kleinere Meinungsverschiedenheiten mit der anderen Lösung. ich würde sagen

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

Der Grund ist, dass dies (korrekt) die einzelnen RGB-Komponenten erfasst. Der andere Ausdruck hat # 112233 in drei Teile geteilt: '#' 112 233. Die Syntax lautet tatsächlich '#' (RR GG BB) | (RGB)

Der leichte Nachteil ist, dass mehr Backtracking erforderlich ist. Wenn Sie #CCC analysieren, wissen Sie nicht, dass das zweite C die grüne Komponente ist, bis Sie das Ende der Zeichenfolge erreicht haben. Wenn Sie #CCCCCC analysieren, wissen Sie nicht, dass das zweite C immer noch Teil der roten Komponente ist, bis Sie das 4. C sehen.

MSalters
quelle
1
Diese Regex würde auch mit # 1234 und # 12345 übereinstimmen. Es können jedoch nur 3 oder 6 Ziffern vorhanden sein. Diese RE erlaubt alles zwischen 3 und 6 Stellen. Wenn Sie wirklich die richtige Struktur erfassen möchten, müssen Sie verwenden #([1-9a-fA-F]{3}|[1-9a-fA-F]{6}). Wenn Sie die einzelnen Farbkomponenten erfassen möchten, wird dies komplexer (Ihr Vorschlag tut dies auch nicht).
Joey
Für reine Validierungszwecke (dh ob ein Wert tatsächlich möglich und korrekt ist) fällt es mir jedoch leichter, die scheinbare Struktur der Zeichenfolge und nicht die angegebene zu betrachten. Zumindest in diesem Fall ist die resultierende RE einfacher.
Joey
2
@MSalters das ist immer noch nicht ganz richtig, da es eine Übereinstimmung für die letzten 3 Ziffern von #FFFF zurückgibt. Hinzufügen eines zusätzlichen Satzes von Klammern: ^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$Behebt das Problem.
Chris
In der Tat war das |nicht in Klammern, also suchte es nach ^#FFFFFFFoder FFF$. Fest.
MSalters
ist nicht ([0-9a-fA-F]{2}){3}gleichbedeutend mit [0-9a-fA-F]{6}?
Chharvey
4

Dies ist der Fall, wenn Sie benannte Farben und RGB (a, b, c) akzeptieren möchten. Das letzte "i" unterscheidet zwischen Groß- und Kleinschreibung.

HTML-Farben (# 123, RGB nicht akzeptiert)

/^(#[a-f0-9]{6}|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i

CSS-Farben (# 123, RGB akzeptiert)

/^(#[a-f0-9]{6}|#[a-f0-9]{3}|rgb *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|rgba *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i
FrancescoMM
quelle
Aber es gibt mehr Farben in HTML unterstützt wie Darkturquoise, Lightgoldenrodyellow und so
Mendon Ashwini
1
@ MendonAshwini ja. Es gibt 140 neue. Sie können sie alle am Ende des regulären Ausdrucks schreiben, der durch | begrenzt ist
FrancescoMM
Ja, ich habe auf Drafts.csswg.org/css-color-4 nachgesehen . Aber ist das der richtige Weg, um es zu variieren? Bietet Java eine Bibliothek?
Mendon Ashwini
4

Alle Antworten erwähnt RGB-Format, hier ist Regex für ARGB-Format:

^#[0-9a-fA-F]{8}$|#[0-9a-fA-F]{6}$|#[0-9a-fA-F]{4}$|#[0-9a-fA-F]{3}$
SamiAzar
quelle
3

Basierend auf der Antwort von MSalters, aber um eine falsche Übereinstimmung zu verhindern, funktioniert Folgendes

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

Oder für einen optionalen Hash # Symbol:

^#?(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

Und ohne dass Rückverweise generiert werden:

^#?(?:(?:[0-9a-fA-F]{2}){3}|(?:[0-9a-fA-F]){3})$
Chris
quelle
2

Rubin

In Ruby haben Sie Zugriff auf die \h(hexadezimale) Zeichenklasse. Sie müssen sich auch mehr um Zeilenenden kümmern, daher die \A...\zhäufigeren^...$

/\A#(\h{3}){1,2}\z/

Dies entspricht 3 oder 6 hexadezimalen Zeichen nach einem #. Also keine RGBA. Es ist auch unabhängig von Groß- und Kleinschreibung, obwohl die iFlagge nicht vorhanden ist.

Aidan
quelle
1
in Ruby haben Sie auch /\H/die nicht hexa Zeichen übereinstimmen, so dass Sie nur die boolean haben zu negieren (0 nicht hexa Zeichen von regex gefunden: es gilt Hexa - Nummer) ab: !"FF000"[/\H/] # true,!"hello"[/\H/] # false
Alexis Delahaye
1

Dies sollte passen alle #rgb, #rgba, #rrggbb, und #rrggbbaaSyntax:

/^#(?:(?:[\da-f]{3}){1,2}|(?:[\da-f]{4}){1,2})$/i

Nervenzusammenbruch:

^            // start of line
#            // literal pound sign, followed by
(?:          // either:
  (?:          // a non-capturing group of:
    [\da-f]{3}   // exactly 3 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
|            // or:
  (?:          // a non-capturing group of:
    [\da-f]{4}   // exactly 4 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
)
$            // end of line
i            // ignore case (let 'A'–'F' match 'a'–'f')

Beachten Sie, dass das oben Gesagte dieser Syntax nicht entspricht, was falsch ist:

/^#(?:[\da-f]{3,4}){1,2}$/i

Dies würde eine Gruppe von 3 ermöglichen, gefolgt von einer Gruppe von 4, z. B. #1234567was keine gültige Hex-Farbe ist.

chharvey
quelle