2014-10-06 46 views
0

我需要用户输入一个十六进制数字,只要他们的输入包含字符A-F0-9它不会重新提示它们。如何检查只有某些字符出现在字符串中?

这就是我输入字符串包含A-F和/或0-9时所运行的内容,如果您添加了其他我不想要的字符,它仍会运行。

do { 
    System.out.print("Enter a # in hex: "); 
    inputHexNum = keyboard.next();  
} while(!(inputHexNum.toUpperCase().matches(".*[A-F0-9].*"))); 
+0

所以你的输入只有2位数?像'FF'或'B3'? – TheLostMind 2014-10-06 14:54:28

回答

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组成的字符。

+0

,那么它也会匹配'4353BB3343543533123434A3A4C3'。 – TheLostMind 2014-10-06 14:57:41

+0

我的理解是那是想要匹配的东西。我可能误解了这个问题...... – Edd 2014-10-06 14:59:58

+0

我给出了相同的答案(并删除了它)。让我们只希望OP能够快速响应。 – TheLostMind 2014-10-06 15:01:24

0

正在使用的正则表达式与每个包含至少一个十六进制数字的字符串匹配。从问题的第一段来看,这正是你想要的。这是因为"."匹配任何字符(但可能不是换行符),所以".*"匹配任何(可能是空的)字符序列。因此,正则表达式".*[A-F0-9].*"的意思是“首先,一些任意字符,然后是十六进制数字,然后是更多字符”。但从问题的第二段看来,您似乎想要使用正则表达式"[A-F0-9]+",这意味着“一些十六进制数字(但至少有一个,而不是其他)”。我假设你对需要做什么感到困惑,但实际上需要第二个。

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()); 
相关问题