2

我有一个文本文件,我迭代并希望检查每行中的多个子字符串(每行将存在 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());
    }

}

Find 不匹配整个字符串,所以我^用来匹配输入的开头。

于 2012-11-25T03:00:52.617 回答