我有一个正则表达式来检查字符串是否是数字。该格式的千位分隔符是空格,小数分隔符是点。小数点后部分是可选的。
问题是,在某些时候 String.matches() 函数会停止按预期工作。以前有效的方法现在不再有效了。
例如,JUnit 代码:
import junit.framework.Assert;
import org.junit.Test;
public class RegExTest {
@Test
public void testThousandSeperatorRegex()
{
String regEx = "([0-9]{1,3}( [0-9]{3})*(\\.[0-9]+)?|\\.[0-9]+)";
Assert.assertEquals(true, "1".matches(regEx));
Assert.assertEquals(true, "10".matches(regEx));
Assert.assertEquals(true, "100".matches(regEx));
Assert.assertEquals(true, "1 000".matches(regEx));
Assert.assertEquals(true, "10 000".matches(regEx));
Assert.assertEquals(true, "100 000".matches(regEx));
Assert.assertEquals(true, "1 000 000".matches(regEx));
Assert.assertEquals(true, "10 000 000".matches(regEx));
Assert.assertEquals(false, "10000.56".matches(regEx));
Assert.assertEquals(true, "8 734".matches(regEx));
}
}
最后一行“8 734”失败。当我用“1000”替换它时,它仍然失败。最终,同一运行中的相同代码在第四行断言中传递,但在最后一行失败(新代码被保存!)。
但有时一切都开始按预期工作,直到......再次开始失败。所以我认为很难重现我的问题。也许还有一些我做错的事情我没有注意到并因此进行了描述,但我试图使其尽可能简单。
这让我很困惑。 String.matches() 有记忆还是什么?
难道正则表达式有问题吗?我正在跳过^$
因为 String.matches 无论如何都适用于整个字符串。我尝试过 java.util.regex 和 jregex 包,问题仍然存在。
我使用的是 JDK 6u31。
任何想法表示赞赏。
UPD:好的,发布这个问题后,代码开始工作,到目前为止还没有失败。也许这是我的问题,但这从上周开始就一直困扰着我,而且我已经能够一次又一次地重复它。我将继续我的代码,如果它继续工作,我将关闭这个问题。我还将尝试确定到底是什么导致了问题。
同时,如果有人遇到同样的问题,请分享您的知识。否则,这看起来像是一个可以通过知识来解决的问题,而不是通过调试来解决。
为了防止自己愚蠢,我可以说我已经编程很多年了,这是论坛上的第一篇帖子:)。到目前为止,我能够通过调试、阅读文档和搜索其他 Q 的论坛来解决我的问题。