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


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.