我以前从来没用过正则表达式,但我知道它们对于处理字符串非常有用。我看了几个教程(例如),但我仍然不明白如何在Java中使用简单的正则表达式检查字符串中的十六进制字符。
用户将在文本框中输入类似于:0123456789ABCDEF
,我想知道输入是否正确,否则如果输入类似于XTYSPG456789ABCDEF
,则返回false。
是否可以使用正则表达式实现这一点,还是我对它们的工作方式存在误解?
我以前从来没用过正则表达式,但我知道它们对于处理字符串非常有用。我看了几个教程(例如),但我仍然不明白如何在Java中使用简单的正则表达式检查字符串中的十六进制字符。
用户将在文本框中输入类似于:0123456789ABCDEF
,我想知道输入是否正确,否则如果输入类似于XTYSPG456789ABCDEF
,则返回false。
是否可以使用正则表达式实现这一点,还是我对它们的工作方式存在误解?
你可以使用正则表达式来实现该功能:
^[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"
}
\p{XDigit}
是预定义的。 - juanmirocks实际上,给出的答案并不完全正确。问题在于数字 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-9a-fA-F]+$
?那么如何实现呢?我的意思是这样正确吗if(labelA.getText().equals(^[0-9A-F]+$)) {...}
?非常感谢您的帮助。 - pondigiPattern hex = Pattern.compile("^[0-9A-F]+$")
),然后通过hex.matcher(string).matches()
进行测试会更有效率。 - Paŭlo Ebermann^
和$
锚点在这里并不必要,因为matches()
总是匹配整个字符串。 - Paŭlo Ebermann^(0x|0X)?[0-9A-Fa-f]+$"
但它也失败了... 能帮忙吗 :( - Udayaditya Barua