Регулярний вираз для шістнадцяткового числа?


113

Як створити регулярний вираз, який виявляє шістнадцяткові числа в тексті?

Наприклад, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' та '8BADF00D'.


1
Regex насправді не розбирає. Спробуйте витягнути всі речі, подібні до числа, і відсійте ті, які не є шістнадцятковими.
— Блендер

Відповіді:


193

Як щодо наступного?

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

Збіг вирази, починаючи з 0, слід або з нижнього, або з великого регістру х, а з ним одного або більше символів у діапазонах 0-9, або af, або AF


35
Це може бути скорочене до /0x[\da-f]/i, але в іншому випадку +1.
— Ніклас Б.

20
@NiklasB. Ваша стенограма дійсна лише в тому випадку, якщо ви використовуєте регулярний вираз perl, якщо використовуєте регулярний вираз POSIX, тоді рішення Стивена є найкоротшим. Так чи інакше, рішення Стівена працює як для perge, так і для POSIX.
— Девід М. Сиздек

Зрозумів! Рішення Стівена добре, якщо шістнадцяткове число починається з 0x або 0X. Це має працювати краще: ^ [0-9A-F] + $ Він також може розпізнати шістнадцяткові шаблони, такі як: '535GH0G73' Для Java ми можемо використовувати, наприклад, String.matches () для перевірки цього. Дякую, хлопці за відповідь :)
— saurcery

2
'0x [\ da-f] {2}' поширюйте краще також обмежити кількість
— Yazan Rawashdeh

2
Чи відповідає це другий та третій приклади числа, 0acdadecf822eeff32aca5830e438cb54aa722e3 та 8BADF00D?
— Пітер Мортенсен

43

Точний синтаксис залежить від ваших точних вимог та мови програмування, але в основному:

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

або простіше кажучи, iробить це нечутливим до регістру.

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

Якщо вам пощастило використовувати Ruby, ви можете:

/\h+/

EDIT - Відповідь Стівена Шредера дала мені зрозуміти, що я розумію, що біт 0x був неправильним, тому я відповідно оновив свої пропозиції. Якщо ви також хочете відповідати 0x, еквіваленти є

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

ДОДАТИ БІЛЬШЕ - Якщо 0x потрібно необов’язково (як випливає з питання):

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

ви можете мені пояснити причину вище RE?
— запій

4
@noobDroid Що конкретно ви хотіли б мені пояснити?
— SimonMayer

18

Це не велика справа, але більшість двигунів-регексів підтримують класи символів POSIX, і є [:xdigit:]можливість узгодження шістнадцяткових символів, що простіше, ніж звичайні 0-9a-fA-Fречі.

Отже, регулярний вираз за запитом (тобто з необов'язковим 0x) є:/(0x)?[[:xdigit:]]+/



11

Варто зазначити, що виявити MD5 (який є одним із прикладів) можна виконати за допомогою:

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


3

Тільки для запису я зазначив би наступне:

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

Який відрізняється тим , що перевіряє , що він має , щоб утримувати шість допустимих символів і на нижньому або верхньому регістрі х в разі , якщо ми маємо один.


2

Якщо ви шукаєте конкретного шістнадцяткового символу посередині рядка, ви можете використовувати "\ xhh", де hh - символ у шістнадцятковій кількості. Я спробував, і це працює. Я використовую фреймворк для C ++ Qt, але це може вирішити проблеми в інших випадках, залежить від аромату, який потрібно використовувати (php, javascript, python, golang тощо).

Ця відповідь була взята від: http://ult-tex.net/info/perl/


Гей! Хоча це може бути правдою для perl, схоже, це не стосується регулярних виразів на всіх мовах програмування. Відповідно, це \x еквівалентно \uв інших мовах.
— Моріс

Що таке "конкретний анда"?
— Пітер Мортенсен

0

Це гарантує, що у вас не більше трьох дійсних пар:

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

Не збігаються будь-які більше або менше трьох пар дійсних символів.


0

Якщо вам це знадобиться на вході, де користувач може ввести 0і 0xтеж, але не шістнадцятковий номер без 0xпрефікса:

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

0

Інший приклад: шістнадцяткові значення кольорів css починаються зі знака фунта або хеша (#), потім шість знаків, які можуть бути або цифрою, або літерою між A і F, включно.

^#[0-9a-fA-F]{6}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.