Строка ДОЛЖНА содержать шестнадцатеричное значение - Regex для этого? [Дубликат]

В шаблоне нет ничего неправильного, предполагая, что он используется для какого-либо аспекта вашей модели, который действительно является одиночным.

Я считаю, что обратная реакция вызвана чрезмерным использованием, которое, в свою очередь, из-за того, что это самый простой шаблон для понимания и реализации.

29
задан Alan Moore 14 February 2016 в 08:58
поделиться

3 ответа

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

^[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 в String:

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

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

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

^[0-9A-Fa-f]+$
87
ответ дан Mark Byers 22 August 2018 в 00:37
поделиться
  • 1
    Если разрешить строчные буквы, я должен сделать это ^[0-9a-fA-F]+$? и как он действительно реализует его, я имею в виду, что это правильно if(labelA.getText().equals(^[0-9A-F]+$)) {...}? Большое спасибо за Вашу помощь – pondigi 15 March 2011 в 21:06
  • 2
    @pondigi: Я добавил пример кода. – Mark Byers 15 March 2011 в 21:48
  • 3
    Если вы используете этот же тест несколько раз, было бы более эффективно скомпилировать шаблон один раз (Pattern hex = Pattern.compile("^[0-9A-F]+$")), а затем проверить на hex.matcher(string).matches(). – Paŭlo Ebermann 15 March 2011 в 21:56
  • 4
    Кстати, якоря ^ и $ здесь не нужны, поскольку matches() всегда соответствует всей строке. – Paŭlo Ebermann 15 March 2011 в 21:57
  • 5
    @Uday: Создайте новый вопрос. И вам нужно будет предоставить дополнительную информацию о том, что вы делаете. Когда вы создаете свой вопрос, не забудьте указать, какой язык программирования вы используете, какой код вы написали до сих пор, какие входные строки вы тестируете, что на самом деле происходит, что вы хотели, и т. Д. Чем больше информации вы предоставляете, тем больше вероятность, что кто-то может вам помочь. – Mark Byers 7 November 2012 в 11:14

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

5
ответ дан Mark Manning 22 August 2018 в 00:37
поделиться

Возможно, вы хотите использовать класс символов 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"
}
9
ответ дан Paul Vargas 22 August 2018 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: