Regex для проверки строки содержит только шестнадцатеричные символы - PullRequest
32 голосов
/ 15 марта 2011

Я никогда раньше не выполнял регулярные выражения, и я видел, что они очень полезны для работы со строками. Я видел несколько обучающих программ (например), но я все еще не могу понять, как сделать простую проверку регулярных выражений Java для шестнадцатеричных символов в строке.

Пользователь будет вводить в текстовое поле что-то вроде: 0123456789ABCDEF, и я хотел бы знать, что в противном случае ввод был правильным, если что-то вроде XTYSPG456789ABCDEF при возврате false.

Можно ли это сделать с помощью регулярного выражения или я неправильно понял, как они работают?

Ответы [ 3 ]

103 голосов
/ 15 марта 2011

Да, вы можете сделать это с помощью регулярного выражения:

^[0-9A-F]+$

Объяснение:

^            Start of line.
[0-9A-F]     Character class: Any character in 0 to 9, or in A to F.
+            Quantifier: One or more of the above.
$            End of line.

Чтобы использовать это регулярное выражение в Java, вы можете, например, вызватьmatches метод для строки:

boolean isHex = s.matches("[0-9A-F]+");

Обратите внимание, что matches находит только точное совпадение, поэтому в этом случае вам не нужны начальные и конечные якоря строки.Посмотрите, как он работает в режиме онлайн: ideone

Вы также можете разрешить использование заглавных и строчных букв AF, в этом случае вы можете использовать это регулярное выражение:

^[0-9A-Fa-f]+$
15 голосов
/ 14 февраля 2016

Возможно, вы захотите использовать класс символов POSIX \p{XDigit}, поэтому:

^\p{XDigit}+$

Дополнительно, если вы планируете использовать регулярное выражениеочень часто рекомендуется использовать константу, чтобы не перекомпилировать ее каждый раз, например:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("^\\p{XDigit}+$");

public static void main(String[] args) {
    String input = "0123456789ABCDEF";
    System.out.println(
        REGEX_PATTERN.matcher(input).matches()
    );  // prints "true"
}
6 голосов
/ 06 ноября 2014

На самом деле, данный ответ не совсем правильный.Проблема возникает потому, что числа 0-9 также являются десятичными значениями.ЧАСТЬ того, что вам нужно сделать, это проверить на 00-99 вместо 0-9, чтобы убедиться, что нижние значения не являются десятичными числами.Вот так:

^([0-9A-Fa-f]{2})+$

Чтобы сказать, что они должны быть в парах!В противном случае - строка это что-то еще!: -)

Пример:

   (Pick one)
   var a = "1e5";
   var a = "10";
   var a = "314159265";

Если бы я использовал принятый ответ в регулярном выражении, он вернул бы ИСТИНА.

   var re1 = new RegExp( /^[0-9A-Fa-f]+$/ );
   var re2 = new RegExp( /^([0-9A-Fa-f]{2})+$/ );

   if( re1.test(a) ){ alert("#1 = This is a hex value!"); }
   if( re2.test(a) ){ alert("#2 = This IS a hex string!"); }
     else { alert("#2 = This is NOT a hex string!"); }

Обратите внимание, что "10"возвращает TRUE в обоих случаях.Если входящая строка имеет только 0-9, вы НЕ МОЖЕТЕ сказать, легко ли это шестнадцатеричное значение или десятичное значение, ЕСЛИ МЕНЬШЕ отсутствует пропущенный ноль перед строками вне длины (шестнадцатеричные значения всегда идут парами - т.е. - младший байт /старший байт).Но такие значения, как «34», являются абсолютно правильными десятичными ИЛИ шестнадцатеричными числами.Они просто означают две разные вещи.

Также обратите внимание, что «3.14159265» не является шестнадцатеричным значением, независимо от того, какой тест вы проводите из-за периода.Но с добавлением "{2}" вы по крайней мере убедитесь, что это действительно шестнадцатеричная строка, а не то, что выглядит как шестнадцатеричная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...