2012-04-12 13 views
5

文字列が数字かどうかを確認する正規表現があります。書式の千単位の区切りは空白、小数点の区切りはドットです。小数点以下は省略可能です。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のフォーラムの検索で自分の問題を解決することができました。

+0

JDK 6u19で動作する –

+0

これらのJUnitテストを呼び出す実際のクラスを投稿できますか? –

+4

あなたは古いコンパイル済みクラスを実行していませんか? –

答えて

1

これまでは私はこの問題をもう発生していません。

いつかこの問題を抱える他の人には、作業中の環境をクリーンアップするよう提案することができます。これは、破損したJVMまたはコンピュータのメモリ状態で何かを行わなければなりません。

ありがとうございました。

0

BTW:すべてのアサーションでプリコンパイル済みのパターンPattern p = Pattern.compile(regEx)とシングルマッチャを使用してください。assertTrue(p.matcher("1 000 000").matches())文字列の一致メソッドは、あなたがそれを呼び出すたびに正規表現のパターンをコンパイルします

関連する問題