2012-11-25 48 views
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); 
    } 
} 

我没有找到我的字符串秒。

该代码编译和运行完美。我遍历该文件,但我从来没有找到我的结果。

我可以帮我解释一下我做错了什么吗?

+0

'匹配(...)'必须匹配整个字符串。考虑显示更多文件行,以便我们可以看到必须分析的文本行的其他配置。 –

+0

它在文档中说它将一个正则表达式作为参数:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#matches(java.lang.String ) –

+0

jason:我没有看到任何与该陈述不同的帖子或评论。 –

回答

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).*" 
+1

如此接近,但迄今为止!非常感谢。将接受我什么时候可以! –

+0

@jasonm:他猜对了,你所寻找的字符串的所有行都以字符串开头。下次请不要让我们猜测,并显示更多的文本文件的行。 –

+0

无论其明显..“\ *。(FOO | BAR)。”*“ –

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()); 
    } 

} 

查找不匹配对整个字符串,所以我用^匹配开始输入。

+0

谢谢我也会试试这个。 –

相关问题