文字列が数字かどうかを確認する正規表現があります。書式の千単位の区切りは空白、小数点の区切りはドットです。小数点以下は省略可能です。Java regex String.matchesは一貫して動作しません
問題は、ある時点で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" との最後の行に失敗しました。私はそれを "1 000"に置き換えると失敗し続けます。結局、同じ実行で同じコードがアサーションの4番目の行に渡されますが、最後に失敗します(新しいコードが保存されます)。 しかし、すべてが期待どおりに動作し始めるまでに時間がかかります。だから、私の問題を再現するのは難しいと思います。たぶん私が気づいていない、間違っている何かがあります。しかし、私はそれをできるだけ平易にしようとしました。 これは私をたくさん混乱させます。 String.matches()にはメモリがありますか?
正規表現に何か問題がありますか?私は^$
をスキップしています。ストリング全体でString.matchesが機能するためです。 java.util.regexとjregexパッケージを試してみたところ、問題は解決しませんでした。
私はJDK 6u31を使用しています。
感謝しています。
UPD:このQを投稿した後、コードが正常に動作し始めていますが、これまで失敗していません。たぶんそれは私と一緒だったかもしれませんが、これは先週から私を悩ませてしまいました。私は何度も何度もそれを再現することができました。私は自分のコードを続けるつもりですが、それが動作し続けるなら、私はこの問題を解決します。また、私は正確に何が問題を引き起こしたのかを判断しようとします。 一方、同じ問題に遭遇した人がいる場合は、あなたの知識を共有してください。それ以外の場合、これはデバッグではなく、知識によって解決できる問題のように見えます。 私は愚かさから自分を守るために、私は何年もプログラミングを続けてきたと言えます。これはフォーラムでは初めての投稿です:)。今まで私はデバッグ、ドキュメントの読み込み、他のQのフォーラムの検索で自分の問題を解決することができました。
JDK 6u19で動作する –
これらのJUnitテストを呼び出す実際のクラスを投稿できますか? –
あなたは古いコンパイル済みクラスを実行していませんか? –