[英]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.