2014-10-06 60 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()); 
相關問題