В шаблоне нет ничего неправильного, предполагая, что он используется для какого-либо аспекта вашей модели, который действительно является одиночным.
Я считаю, что обратная реакция вызвана чрезмерным использованием, которое, в свою очередь, из-за того, что это самый простой шаблон для понимания и реализации.
Да, вы можете сделать это с помощью регулярного выражения:
^[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]+$
На самом деле данный ответ не совсем корректен. Проблема возникает из-за того, что числа 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}» вы по крайней мере гарантируете, что это действительно шестнадцатеричная строка, а не что-то, что СМОТРЕТЬ как шестнадцатеричная строка.
Возможно, вы хотите использовать класс символов 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"
}
^[0-9a-fA-F]+$
? и как он действительно реализует его, я имею в виду, что это правильноif(labelA.getText().equals(^[0-9A-F]+$)) {...}
? Большое спасибо за Вашу помощь – pondigi 15 March 2011 в 21:06Pattern hex = Pattern.compile("^[0-9A-F]+$")
), а затем проверить наhex.matcher(string).matches()
. – Paŭlo Ebermann 15 March 2011 в 21:56^
и$
здесь не нужны, посколькуmatches()
всегда соответствует всей строке. – Paŭlo Ebermann 15 March 2011 в 21:57