2011-10-28 37 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()不需要锚点。这没有以任何方式解决问题。 –