2012-11-25 73 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

謝謝我也會試試這個。 –

相關問題