我需要十六进制数字的用户输入,只要他们的输入包含字符A-F
或0-9
,它就不会重新提示它们。
这就是我所拥有的,只要输入的字符串包含A-F和/或0-9,如果你添加我不想要的其他字符,它仍会运行。
do {
System.out.print("Enter a # in hex: ");
inputHexNum = keyboard.next();
} while(!(inputHexNum.toUpperCase().matches(".*[A-F0-9].*")));
答案 0 :(得分:3)
你能否将你的正则表达式改为[A-F0-9]+
?
所以你的代码如下所示:
do {
System.out.print("Enter a # in hex: ");
inputHexNum = keyboard.next();
} while(!(inputHexNum.toUpperCase().matches("[A-F0-9]+")));
正如我理解这个问题,你当前正则表达式的问题在于它允许任何字符出现零次或多次,然后是十六进制字符,然后是任何旧字符再次出现零次或多次。这会将整个输入限制为仅包含至少一个由字母A-F(大写)和数字0-9组成的字符。
答案 1 :(得分:2)
你的正则表达可能不会做你想要的。 .*
匹配任何内容(空字符串,任意数量的任意字符)。那么你期望一个十六进制字符再次跟随任何东西。
所以这些是有效的输入:
--0--
a
JFK
你应该说"我想要一个只包含有效十六进制数字的字符串。那么你的条件是:
while(!(inputHexNum.toUpperCase().matches("[A-F0-9]+")));
或者您可以使用模式[^A-F0-9]
检查任何非法字符。在这种情况下,您需要自己创建一个Matcher
:
Pattern illegalCharacters = Pattern.compile("[^A-F0-9]");
Matcher matcher;
do {
...
matcher = illegalCharacters.matches(inputHexNum.toUpperCase());
} while( matcher.find() );
答案 2 :(得分:0)
您正在使用的正则表达式匹配包含至少一个十六进制数字的每个字符串。从问题的第一段来看,这正是你想要的。这是因为"."
匹配任何字符(但可能不是换行符),因此".*"
匹配任何(可能是空的)字符序列。因此,正则表达式".*[A-F0-9].*"
表示"首先是一些任意字符,然后是十六进制数字,然后是更多字符"。但是从问题的第二段开始看起来你想要使用正则表达式"[A-F0-9]+"
,这意味着"一些十六进制数字(但至少有一个,没有别的)"。我假设你对需要做什么很困惑,但实际上想要第二个。