繁体   English   中英

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

[英]Regex to check string contains only Hex characters

我以前从未做过正则表达式,而且我发现它们对于处理字符串非常有用。 我看过一些教程 (例如),但是我仍然不明白如何对字符串中的十六进制字符进行简单的Java正则表达式检查。

用户将在文本框中输入以下内容: 0123456789ABCDEF ,我想知道该输入是正确的,否则,当返回false时,例如XTYSPG456789ABCDEF

是否可以使用正则表达式来做到这一点,或者我是否误解了它们的工作原理?

是的,您可以使用正则表达式来做到这一点:

^[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中使用此正则表达式,您可以例如在String上调用matches方法:

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

请注意, matches仅查找完全匹配项,因此在这种情况下,您不需要行锚的开始和结束。 看到它在线上工作: ideone

您可能还希望同时允许大写和小写AF,在这种情况下,您可以使用以下正则表达式:

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

可能是您想使用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-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}”,您至少要确保它确实是一个十六进制字符串,而不是像十六进制字符串那样看起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM