2

繰り返し処理するテキスト ファイルがあり、各行に複数の部分文字列があるかどうかを確認します (1 行に 1 つの部分文字列が存在します)。

私の正規表現は次のとおりです

String rE = "(AGG|TIP|IDV|DVY|IYR|LQD|HYG|EMB|ACWI|ACWX|EFA|SCZ|EEM|IWB|IWF|IWD|IWM|IWO|IWN|IWV|IVV|IVW|IVE|IJH|IJK|IJJ|MUB|IJR|IJS|IJT|SPY)"

私のテキストファイルの行は次のようになります。

SPY,6696832,31080,140.7,400,140.69,140.69,6396960,299872

まだ私がするとき:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
System.out.println("Starting");
while ((retStr = in.readLine()) != null) {
    if(retStr.matches(tickers)){
         System.out.println(retStr);
    }
}

弦が見つかりません。

コードは完全にコンパイルおよび実行されます。ファイルを反復処理しますが、結果が見つかりません。

私が間違っていることについて何か助けてもらえますか?

4

2 に答える 2

4

.*正規表現の最後に追加するだけです(.*何でも一致します):

String rE = "(AGG|TIP|IDV|DVY|IYR|LQD|HYG|EMB|ACWI|ACWX|EFA|SCZ|EEM|" +
     "IWB|IWF|IWD|IWM|IWO|IWN|IWV|IVV|IVW|IVE|IJH|IJK|IJJ|MUB|IJR|IJS|IJT|SPY).*"
于 2012-11-25T02:45:54.460 に答える
1

パフォーマンスを向上させるには、正規表現をコンパイルする必要があります。Stringのmatchesメソッドは毎回式を再コンパイルしますが、ループ内で使用するためのものではありません。

これが例です

import static org.junit.Assert.assertEquals;
import java.util.regex.Pattern;
import org.junit.Test;

public class Example {

    @Test
    public void shouldMatchString() {
        Pattern p = Pattern.compile("^(AAA|BBB|CCC)");
        assertEquals(true, p.matcher("AAA,1,2,3,4,5").find());
        assertEquals(false, p.matcher("    AAA").find());
    }

}

検索は文字列全体と一致しないため^、入力の先頭と一致させるために使用しています。

于 2012-11-25T03:00:52.617 に答える