pon*_*igi 37 java regex validation
我之前从未做过正则表达式,我发现它们对于使用字符串非常有用.我看了几个教程(例如)但我仍然无法理解如何对字符串中的十六进制字符进行简单的Java正则表达式检查.
用户将在文本框中输入类似于:0123456789ABCDEF并且我想知道输入是正确的,否则XTYSPG456789ABCDEF返回false时返回false.
有可能用正则表达式做到这一点还是我误解了它们是如何工作的?
Mar*_*ers 107
是的,您可以使用正则表达式执行此操作:
^[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]+");
Run Code Online (Sandbox Code Playgroud)
请注意,matches只找到完全匹配,因此在这种情况下您不需要行锚的起点和终点.看到它在线工作:ideone
您可能还希望同时允许大写和小写AF,在这种情况下,您可以使用此正则表达式:
^[0-9A-Fa-f]+$
Pau*_*gas 16
可能你想使用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"
}
Run Code Online (Sandbox Code Playgroud)
实际上,给出的答案并不完全正确.出现问题的原因是数字0-9也是十进制值.您要做的部分是测试00-99而不是0-9,以确保较低的值不是十进制数.像这样:
^([0-9A-Fa-f]{2})+$
Run Code Online (Sandbox Code Playgroud)
要说这些必须成对出现!否则 - 字符串是别的东西!:-)
例:
(Pick one)
var a = "1e5";
var a = "10";
var a = "314159265";
Run Code Online (Sandbox Code Playgroud)
如果我在正则表达式中使用了接受的答案,则返回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!"); }
Run Code Online (Sandbox Code Playgroud)
请注意,"10"在两种情况下都返回TRUE.如果传入的字符串只有0-9,你就无法分辨,如果是十六进制值或十进制值,除非在长度字符串前面有一个缺失的零(十六进制值总是成对出现 - 即 - 低字节/高字节).但是像"34"这样的值都是完全有效的十进制或十六进制数.他们只是意味着两件事.
另请注意,"3.14159265"不是十六进制值,无论您因为期间而进行哪项测试.但是通过添加"{2}",您至少确保它确实是十六进制字符串而不是像十六进制字符串那样的东西.