Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

^[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

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

^[0-9A-Fa-f]+$

Ответ 2

\p{XDigit}, вы захотите использовать класс символов 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"
}

Ответ 3

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

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

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

Пример:

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

Если я использовал принятый ответ в регулярном выражении, он вернет TRUE.

   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}" вы по крайней мере гарантируете, что это действительно шестнадцатеричная строка, а не что-то, что СМОТРЕТЬ как шестнадцатеричная строка.