正则表达式检查字符串仅包含十六进制字符
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。谢谢! :-)以上是关于正则表达式检查字符串仅包含十六进制字符的主要内容,如果未能解决你的问题,请参考以下文章