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

Posted

技术标签:

【中文标题】正则表达式检查字符串仅包含十六进制字符【英文标题】:Regex to check string contains only Hex characters 【发布时间】:2011-07-16 02:19:00 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

如果允许小写我应该这样做^[0-9a-fA-F]+$?以及如何实际实现它,我的意思是这是正确的if(labelA.getText().equals(^[0-9A-F]+$)) ...?非常感谢您的帮助 如果你多次使用同一个测试,编译一次模式(Pattern hex = Pattern.compile("^[0-9A-F]+$"))然后通过hex.matcher(string).matches()测试会更有效。 顺便说一下,^$ 锚在这里不是必需的,因为 matches() 总是匹配整个字符串。 回复这条评论有点老了。但是我正在尝试上面的解决方案,当字符串开头为“0x”时它失败了我试过^(0x|0X)?[0-9A-Fa-f]+$"但它也失败了......这里有任何帮助:( @Uday:创建一个新问题。您需要提供有关您正在做什么的更多信息。当您创建问题时,请记住包括您正在使用的编程语言、到目前为止您编写的代码、您正在测试的输入字符串、实际发生的情况、您想要发生的事情等。您提供的信息越多,有人可以帮助您的可能性就越大。【参考方案2】:

可能你想使用 POSIX 字符类\pXDigit,所以:

^\pXDigit+$

另外,如果你打算经常使用正则表达式,建议使用常量以避免每次都重新编译,例如:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("^\\pXDigit+$");

public static void main(String[] args) 
    String input = "0123456789ABCDEF";
    System.out.println(
        REGEX_PATTERN.matcher(input).matches()
    );  // prints "true"

【讨论】:

这应该是公认的答案,因为\pXDigit 是预定义的【参考方案3】:

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

【讨论】:

我认为这稍微超出了这个问题的范围,因为它没有提到字节对。验证完全取决于您需要的十六进制表示。 129h 和 ACEh 都是有效的十六进制数字,它们只是无效的字节对。 另外,3.14159265 是一个有效的real number in hex。 #1 上面:实际上,仅仅因为我没有使用您的术语(即:字节对)并不意味着我没有说它(注意:“要说这些必须成对出现! ”)。您正在使用不同的方法(即:###h)。 “h”对我来说是十六进制(对你来说) 0x## 表示十六进制。因此,javascript 中的 129h 可能表示也可能不表示十六进制值,就像 0x## 可能表示十六进制值一样。 #2 上面:“3.14159265”的值并不意味着它是过去的十六进制值。会发生的事情是,它只会在这段时间之后打击一切。它现在可能意味着一个十六进制值,但实际上 - 十六进制不做分数。十六进制做整数。您能否显示一个链接,您只需在其中说“var a = 3.14152965;”然后将其显示为十六进制值。没有功能。没有图书馆。只是普通的Javascript。谢谢! :-)

以上是关于正则表达式检查字符串仅包含十六进制字符的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是是十六进制数的有效表示

包含至少一个字母的 16 十六进制字符字符串的正则表达式

正则表达式 - 从字符串中仅获取十进制数

如何使用正则表达式检查用户输入是不是仅包含特殊字符?

如何获得正则表达式来检查字符串是不是仅包含字母字符 [a-z] 或 [A-Z]?

正则表达式