Регулярное выражение для шестнадцатеричного числа?

114

Как создать регулярное выражение, определяющее шестнадцатеричные числа в тексте?

Например, «0x0f4», «0acdadecf822eeff32aca5830e438cb54aa722e3» и «8BADF00D».

мясной магазин
источник
1
Regex на самом деле не разбирает. Попробуйте извлечь все числа, похожие на числа, и отсеять те, которые не являются шестнадцатеричными.
Blender

Ответы:

195

Как насчет следующего?

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

Соответствует выражению, начинающемуся с 0, за которым следует либо нижний, либо верхний регистр x, за которым следует один или несколько символов в диапазоне 0–9, или af, или AF.

Стивен Шредер
источник
35
Это можно было бы сократить до /0x[\da-f]/i+1.
Никлас Б.
20
@NiklasB. Ваша стенография действительна только при использовании регулярного выражения Perl, при использовании регулярного выражения POSIX решение Стивена является самым коротким. В любом случае решение Стивена работает как для регулярных выражений Perl, так и для POSIX.
Дэвид М. Сыздек
Понял! Решение Стивена хорошо, если шестнадцатеричное число начинается с 0x или 0X. Этот должен работать лучше: ^ [0-9A-F] + $ Он также может распознавать шестнадцатеричные шаблоны, такие как: '535GH0G73'. Для Java мы можем использовать, например, String.matches () для проверки этого .. Спасибо, ребята, за ответ :)
saurcery
2
'0x [\ da-f] {2}', возможно, лучше также ограничить число
Язан Равашдех
2
Соответствует ли это второму и третьему примерам чисел, 0acdadecf822eeff32aca5830e438cb54aa722e3 и 8BADF00D?
Питер Мортенсен
45

Точный синтаксис зависит от ваших требований и языка программирования, но в основном:

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

или, проще говоря, iделает его нечувствительным к регистру.

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

Если вам посчастливилось использовать Ruby, вы можете:

/\h+/

ИЗМЕНИТЬ - Ответ Стивена Шредера заставил меня понять, что мое понимание бита 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:]]+/

смати
источник
12

Стоит отметить, что обнаружение MD5 (что является одним из примеров) может быть выполнено с помощью:

[0-9a-fA-F]{32}
Ададдинсане
источник
11

Это будет соответствовать с 0xпрефиксом или без него

(?:0[xX])?[0-9a-fA-F]+

Павел Фурманяк
источник
5

Если вы используете Perl или PHP, вы можете заменить

[0-9a-fA-F]

с участием:

[[:xdigit:]]
Иоахим
источник
Это должен быть самостоятельный ответ.
Питер Мортенсен
3

Для протокола я бы уточнил следующее:

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

Который отличается тем, что он проверяет, что он должен содержать шесть действительных символов и строчные или прописные буквы x, если он у нас есть.

летучая мышь
источник
2

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

Этот ответ был взят из: http://ult-tex.net/info/perl/

Фабио Борхес
источник
Привет! Хотя это может быть верно для Perl, похоже, что это не относится к регулярным выражениям во всех языках программирования. По этому \x эквивалентно на \uдругих языках.
Морис
Что такое «особенная анда»?
Питер Мортенсен
1

Это гарантирует, что у вас не более трех действительных пар:

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

Любые более или менее трех пар действительных символов не совпадают.

Местные потребности
источник
1

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

^#[0-9a-fA-F]{6}
Томми Васкес
источник
0

В случае, если вам это нужно внутри ввода, где пользователь может ввести 0и 0xтоже, но не шестнадцатеричное число без 0xпрефикса:

^0?[xX]?[0-9a-fA-F]*$
Пол Разван Берг
источник