我以前从未使用过正则表达式,但我发现它们对于处理字符串非常有用。我看到了一些 tutorials (例如),但我仍然无法理解如何对字符串中的十六进制字符进行简单的 Java 正则表达式检查。
用户将在文本框中输入类似:
0123456789ABCDEF
的内容,我想知道输入是否正确,否则如果返回 false 时出现类似XTYSPG456789ABCDEF
的内容。
是否可以使用正则表达式来做到这一点,或者我是否误解了它们的工作原理?
是的,您可以使用正则表达式来做到这一点:
^[0-9A-F]+$
说明:
^ 行首。 [0-9A-F] 字符类别:0 到 9 或 A 到 F 中的任何字符。 + 量词:以上一项或多项。 $ 行尾。
要在 Java 中使用此正则表达式,您可以在字符串上调用
matches
方法:
boolean isHex = s.matches("[0-9A-F]+");
请注意,
matches
仅找到完全匹配的内容,因此在这种情况下您不需要行锚点的开始和结束。查看它在线运行:ideone
您可能还希望同时允许大写和小写 A-F,在这种情况下您可以使用以下正则表达式:
^[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}”,您至少可以确保它确实是一个十六进制字符串,而不是看起来像十六进制字符串的东西。
如果十六进制字符串包含 0x 你可以使用
String inputHexPattern = "(0?[xX]?)([0-9a-fA-F][0-9a-fA-F]+)";
public static String getPatternText(String text, String inputPattern){
String currentValue = null;
Pattern pattern = Pattern.compile(inputPattern, Pattern.MULTILINE | Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
if(matcher.find())
{
currentValue = matcher.group();
}
return currentValue;
}