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

问题描述 投票:0回答:4

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

用户将在文本框中输入类似:

0123456789ABCDEF
的内容,我想知道输入是否正确,否则如果返回 false 时出现类似
XTYSPG456789ABCDEF
的内容。

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

java regex validation
4个回答
131
投票

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

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

36
投票

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

13
投票

实际上,给出的答案并不完全正确。 出现问题是因为数字 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}”,您至少可以确保它确实是一个十六进制字符串,而不是看起来像十六进制字符串的东西。


0
投票

如果十六进制字符串包含 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.