3

"((\\-)?[0-9]+(.([0-9])+)? )+"それぞれが単一のスペースで区切られた数列に一致する必要があるこの正規表現があります。たとえば、「5 4 1 22.437.8」または「541 22.48.0017.8」。

文字列が正規表現と一致するかどうかを確認するには、次のようにします。

if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)? )+")){
    // anything
}

上記の例のようにこの小さな文字列を指定すると、完全に機能します。ただし、「2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000」のような長い文字列の場合、一致する場合は完全に機能しますが、一致しない場合は最大5秒かかります。これをチェックして:

String value = "2000000 2000000 2000000 2000000 2000000 2000000 2000000 2000000 h";

System.out.println("Start: "+System.currentTimeMillis());
if((value+" ").matches("((\\-)?[0-9]+(.([0-9])+)? )+")){
    System.out.println("OK");
}else{
    System.out.println("NOK");
}
System.out.println("End: "+System.currentTimeMillis());

これには最大5秒かかります!! 一方、文字列の末尾から「h」を削除した場合、1ミリ秒未満かかります。

何か案は?

4

2 に答える 2

3

上記を一連の数値に分割し(空白で分割することにより)、各サブ文字列に単純な正規表現を適用すると、パフォーマンスが大幅に向上すると思います。

于 2012-11-27T10:36:42.087 に答える
1

まず、正規表現を修正する必要があります。

"((\\-)?[0-9]+(\\.([0-9])+)? )+"

バージョンは、スペースを含む2つの数字の間の任意の記号と一致するためです。多分これはパフォーマンスを低下させます。

その後、最初に任意の文字を見つけようとすることができます。見つかった場合は、誰かが前に言ったように、正規表現を確認したり、小さな断片に分割したりしないでください。

于 2012-11-27T10:40:08.643 に答える