2012-11-11 122 views
2

我有一些文本;我想提取未被標點符號分隔的單詞對。這是代碼:Java正則表達式跳過匹配

//n-grams 
Pattern p = Pattern.compile("[a-z]+"); 
if (n == 2) { 
    p = Pattern.compile("[a-z]+ [a-z]+"); 
} 
if (n == 3) { 
    p = Pattern.compile("[a-z]+ [a-z]+ [a-z]+"); 
} 
Matcher m = p.matcher(text.toLowerCase()); 
ArrayList<String> result = new ArrayList<String>(); 

while (m.find()) { 
    String temporary = m.group(); 
    System.out.println(temporary); 

    result.add(temporary); 
} 

問題是它跳過一些匹配。例如

「我的名字是詹姆斯」

,n = 3時,必須匹配

「我的名字是」 和 「的名字是詹姆斯」

,但它只是匹配第一個。有沒有辦法解決這個問題?

回答

4

你可以用它組先行

(?=(\b[a-z]+\b \b[a-z]+\b \b[a-z]+\b)) 

這使得它有兩種groups..So你的情況來捕捉這將是

Group1->my name is

Group2-捕捉>name is james

+3

+1我知道**有更好的方法。 –

1

在由正則表達式定義的正則表達式模式中,從左向右應用字符串,並且一旦在匹配中使用了源字符,就不能重用它。

例如,正則表達式「121」將僅匹配「31212142121」兩次作爲「 ___121」。

+0

有沒有辦法解決這個問題? –

+0

不,你可以通過在'group'中使用'lookahead'來捕獲它,就像這樣('=?(121))' – Anirudha

+0

我不知道我們可以重複使用已使用的單元。你可以嘗試split()方法來實現這一點。 – Pankaj

1

我傾向於使用find()方法的參數Matcher

Matcher m = p.matcher(text); 
int position = 0; 
while (m.find(position)) { 
    String temporary = m.group(); 
    position = m.start(); 
    System.out.println(position + ":" + temporary); 
    position++; 
} 

所以在每次迭代之後,它會根據最後一個開始索引再次搜索。

希望有幫助!

+1

這匹配「名稱是債券」,「阿姆是債券」,「我是債券」... :) –

+0

哦!對!我正在考慮另一種類型的正則表達式,比如像'abababa'這樣的字符串中搜索一個像'aba'這樣的字符串。做_my way_解決問題並查找所有事件。很抱歉對於這個誤會!你肯定需要另一種方法。 –