2011-10-28 94 views
1

我感覺很傻,我無法弄清楚這一點,但它真的開始讓我失望。Java正則表達式快速

我只是試圖確保字符串只包含使用string.match(regex)的數字。如果它包含任何非數字字符,請將其硬編碼爲9999999.

這是我的代碼。我基本上檢查,看看我從ResultSet moduleResult結果中包含的結果是否包含沒有非數字字符,然後使用setEndPointID接受long作爲其參數。 trim()在那裏,因爲id_amr_module中經常有前導空格,我不希望那些拋出正則表達式匹配。我也嘗試過正則表達式[0-9] *,但沒有成功。

String strEndPointID = moduleResults.getString("id_amr_module"); 
strEndPointID.trim(); 
if(strEndPointID.matches("\\d*")){ 
    msiRF.setEndpointID(moduleResults.getLong("id_amr_module")); 
} 
else{ 
    long lngEndPointID = 99999999; 
    msiRF.setEndpointID(lngEndPointID); 
} 

回答

4

您需要start and end anchors以確保整個串數字。您還需要使用+而不是*,以便正則表達式匹配至少1位數字(^\\d*$將匹配空字符串)。完全重構:

long endPointID = 99999999; 
String strEndPointID = moduleResults.getString("id_amr_module").trim(); 
if(strEndPointID.matches("^\\d+$")){ 
    endPointID = Long.parseLong(strEndPointID); 
} 
msiRF.setEndpointID(endPointID); 
+1

String.matches結束()不需要錨。 –

+1

你說得對。看看我多久使用'String#matches()'。我猜OP的唯一缺失是'+'而不是'*'。 –

+2

+1也用於糾正OP對trim()的使用。 @TyC,您使用它的方式沒有效果,因爲您沒有將'trim()'的結果賦值給變量:'strEndPointID = strEndPointID.trim();' –

4

的問題是,你的正則表達式的任何數量的數字搜索。你所尋找的是這樣的:^\d+$

  • ^表示字符串
  • \d+意味着開始至少一位
  • $表示字符串
+0

其實......開始和結束的錨點不應該是必須的,至少如果有人相信[regular-expressions.info]上寫的是什麼(http://www.regular-expressions.info/java.html) – Roman

+0

羅馬是正確的 - 我測試確定。 –

+1

姆姆。我從未注意到這一點。這絕對是奇怪的。儘管如此,它並沒有真正解決這個問題,但作者仍然接受了與我非常相似的答案。 ;) –

2

結束你正則表達式應該是:

"^\\d*$" 

^ - 從啓動開始 \\d* - 你找到 $匹配儘可能多的數字 - 直到達到字符串

+1

-1不正確 - String.matches()不需要錨點。這沒有以任何方式解決問題。 –