Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于检查字符串的正则表达式仅包含十六进制字符_Java_Regex_Validation - Fatal编程技术网

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

Java 用于检查字符串的正则表达式仅包含十六进制字符,java,regex,validation,Java,Regex,Validation,我以前从未使用过正则表达式,我发现它们对于处理字符串非常有用。我看到了一些(例如),但我仍然无法理解如何对字符串中的十六进制字符进行简单的Java正则表达式检查 用户将在文本框中输入如下内容:0123456789ABCDEF,如果返回false时输入的内容类似于XTYSPG456789ABCDEF,我想知道输入是否正确 是否可以使用正则表达式执行此操作,或者我是否误解了它们的工作原理?是的,可以使用正则表达式执行此操作: ^[0-9A-F]+$ ^[0-9A-Fa-f]+$ 请注意,匹配仅查找精

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

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


是否可以使用正则表达式执行此操作,或者我是否误解了它们的工作原理?

是的,可以使用正则表达式执行此操作:

^[0-9A-F]+$ ^[0-9A-Fa-f]+$ 请注意,
匹配
仅查找精确匹配,因此在这种情况下不需要线锚的起点和终点。在线查看它的工作情况:

您可能还希望同时允许大写和小写A-F,在这种情况下,您可以使用以下正则表达式:

^[0-9A-F]+$ ^[0-9A-Fa-f]+$ ^[0-9A-Fa-f]+$
事实上,给出的答案并不完全正确。问题的出现是因为数字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}”之后,您至少可以确保它确实是一个十六进制字符串,而不是看起来像十六进制字符串的东西。

可能是您想要使用POSIX字符类
\p{XDigit}
,因此:

^\p{XDigit}+$
此外,如果计划经常使用正则表达式,建议使用常量以避免每次重新编译,例如:

private静态最终模式REGEX\u模式=
compile(“^\\p{XDigit}+$”;
公共静态void main(字符串[]args){
字符串输入=“0123456789ABCDEF”;
System.out.println(
REGEX_PATTERN.matcher(输入).matches()
);//打印“真”
}

如果允许小写,我应该这样做
^[0-9a-fA-F]+$
?实际上如何实现它,我的意思是,如果(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:创建一个新问题。你需要提供更多关于你正在做什么的信息。当你创建问题时,记得包括你正在使用的编程语言、到目前为止你编写的代码、你正在测试的输入字符串、实际发生的事、你想要发生的事等等。你提供的更多信息这应该是公认的答案,因为
\p{XDigit}
是预定义的,我认为这稍微超出了这个问题的范围,因为它没有提到字节对。验证完全取决于您需要的十六进制表示形式。129h和ACEh都是有效的十六进制数,它们只是不是有效的字节对。此外,3.14159265是一个有效的。上面的#1:实际上,因为我没有使用您的术语(即:字节对)并不意味着我没有说它(注意:“要说它们必须成对出现!”)。您使用的是另一种方法(即:#####h)。对我来说,“h”表示它是十六进制0x##表示十六进制。因此,Javascript中的129h可能表示十六进制值,也可能不表示十六进制值,就像0x###可以表示十六进制值一样。#上面第2条:“3.14159265”的值“这并不意味着它在过去是一个十六进制值。会发生的是,它会在周期结束后把所有的东西都打掉。它现在可能意味着一个十六进制值,但事实上-十六进制不做分数。十六进制做整数。你能不能显示一个链接,在那里你只说“var a=3.14152965;”然后将其显示为十六进制值。没有函数。没有库。只有普通Javascript。谢谢!:-)