Wyrażenie regularne dla liczby szesnastkowej?


114

Jak utworzyć wyrażenie regularne, które wykrywa liczby szesnastkowe w tekście?

Na przykład „0x0f4”, „0acdadecf822eeff32aca5830e438cb54aa722e3” i „8BADF00D”.


1
Regex tak naprawdę nie analizuje. Spróbuj wyodrębnić wszystkie rzeczy podobne do liczb i odszukaj te, które nie są liczbami szesnastkowymi.
Blender

Odpowiedzi:


193

A co z następującymi?

0[xX][0-9a-fA-F]+

Dopasowuje wyrażenie zaczynające się od 0, po którym następuje mała lub duża litera x, po którym następuje jeden lub więcej znaków z zakresu 0-9, lub af lub AF


35
Można to skrócić do /0x[\da-f]/i+1.
Niklas B.

20
@NiklasB. Twój skrót jest ważny tylko wtedy, gdy używasz wyrażenia regularnego perl, jeśli używasz wyrażenia regularnego POSIX, to rozwiązanie Stevena jest najkrótsze. Tak czy inaczej, rozwiązanie Stevena działa zarówno dla perl, jak i dla POSIX regex.
David M. Syzdek

Rozumiem! Rozwiązanie Stevena jest dobre, jeśli liczba szesnastkowa zaczyna się od 0x lub 0X. Ten powinien działać lepiej: ^ [0-9A-F] + $ Potrafi również rozpoznawać wzorce szesnastkowe, takie jak: '535GH0G73' W Javie możemy użyć np. String.matches (), aby to sprawdzić .. Dziękuję za odpowiedź :)
saurcery

2
„0x [\ da-f] {2}” też zdecydowanie lepiej ograniczyć liczbę
Yazan Rawashdeh

2
Czy pasowałoby to do drugiej i trzeciej przykładowej liczby, 0acdadecf822eeff32aca5830e438cb54aa722e3 i 8BADF00D?
Peter Mortensen,

44

Dokładna składnia zależy od twoich dokładnych wymagań i języka programowania, ale zasadniczo:

/[0-9a-fA-F]+/

lub po prostu isprawia , że wielkość liter nie jest rozróżniana.

/[0-9a-f]+/i

Jeśli masz szczęście, że używasz Rubiego, możesz:

/\h+/

EDYCJA - odpowiedź Stevena Schroedera uświadomiła mi, że moje rozumienie bitu 0x było błędne, więc odpowiednio zaktualizowałem moje sugestie. Jeśli chcesz również dopasować 0x, odpowiednikami są

/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i

DODANO WIĘCEJ - Jeśli 0x musi być opcjonalne (jak sugeruje pytanie):

/(0x)?[0-9a-f]+/i

czy możesz mi wyjaśnić powód powyższego RE?
saurcery

4
@noobDroid Co konkretnie mam wyjaśnić?
SimonMayer,

18

Nic wielkiego, ale większość silników regex obsługuje klasy znaków POSIX i jest [:xdigit:]do dopasowywania znaków szesnastkowych, co jest prostsze niż zwykłe 0-9a-fA-Frzeczy.

Tak więc wyrażenie regularne zgodnie z żądaniem (tj. Z opcją 0x) to:/(0x)?[[:xdigit:]]+/



11

Warto wspomnieć, że wykrycie MD5 (co jest jednym z przykładów) można wykonać za pomocą:

[0-9a-fA-F]{32}


3

Dla przypomnienia, określiłbym co następuje:

/^[xX]?[0-9a-fA-F]{6}$/

Różni się tym, że sprawdza, czy musi zawierać sześć prawidłowych znaków i małe lub duże litery x, jeśli mamy jeden.


2

Jeśli szukasz określonego znaku szesnastkowego w środku ciągu, możesz użyć „\ xhh”, gdzie hh to znak szesnastkowy. Próbowałem i działa. Używam frameworka dla C ++ Qt, ale może rozwiązać problemy w innych przypadkach, w zależności od smaku, którego potrzebujesz (php, javascript, python, golang itp.).

Ta odpowiedź pochodzi z: http://ult-tex.net/info/perl/


Hej! Chociaż może to być prawdą w przypadku perla, nie wydaje się, aby miało to miejsce w przypadku wyrażeń regularnych we wszystkich językach programowania. Zgodnie z tym \x jest odpowiednikiem \uw innych językach.
Maurice,

Co to jest „especific anda”?
Peter Mortensen

0

Dzięki temu masz nie więcej niż trzy prawidłowe pary:

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

Jakiekolwiek mniej lub więcej niż trzy pary prawidłowych znaków nie pasują.


0

W tym przypadku trzeba obrębie wejścia, w którym użytkownik może wpisać 0, a 0xtakże, ale nie wiele hex bez 0xprefiksu:

^0?[xX]?[0-9a-fA-F]*$

0

Inny przykład: wartości szesnastkowe dla kolorów css zaczynają się od krzyżyka lub krzyżyka (#), a następnie sześć znaków, które mogą być cyfrą lub literą z przedziału od A do F włącznie.

^#[0-9a-fA-F]{6}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.