检查字符串的正则表达式只包含十六进制字符

时间:2011-03-15 20:02:02

标签: java regex validation

我之前从未做过正则表达式,我看到它们对于使用字符串非常有用。我看到了一些tutorials(例如)但我仍然无法理解如何对字符串中的十六进制字符进行简单的Java正则表达式检查。

用户将在文本框中输入类似于:0123456789ABCDEF的内容,我想知道输入是正确的,否则返回false时会出现类似XTYSPG456789ABCDEF的内容。

是否有可能用正则表达式做到这一点,还是我误解了它们是如何工作的?

3 个答案:

答案 0 :(得分:98)

是的,您可以使用正则表达式执行此操作:

^[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]+$

答案 1 :(得分:14)

您可能想要使用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"
}

答案 2 :(得分:6)

实际上,给出的答案并不完全正确。出现问题的原因是数字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; 34"都是完全有效的十进制或十六进制数。它们只是意味着两件事。

另请注意" 3.14159265"由于期间的原因,无论您进行哪种测试,都不是十六进制值。但是增加了" {2}"你至少确保它确实是一个十六进制字符串,而不是看起来像十六进制字符串。