2012-02-18 45 views
0

我正在Java中讀取超過100000個字符的字符串。 我有一個關鍵字的列表,我搜索字符串,如果字符串存在,我調用一個函數,做一些內部處理。正則表達式不提取確切模式

例如,我所擁有的關鍵詞的種類是「臉」,我希望獲得所有的模式,我有匹配「臉」而不是「臉譜」。我可以接受字符串中臉部後面的空格字符,所以如果在字符串中我有像「臉部」或「臉部」或「臉部」或「臉部」的匹配,我也可以接受。但是我不能接受「duckface」或「duckface」等

我寫的正則表達式

Pattern p = Pattern.compile("\\s+"+keyword+"s\\s+|\\s+"); 

其中關鍵字是我的關鍵字的列表,但我沒有得到預期的效果。你能閱讀我的描述,並請建議什麼可能是問題,以及我如何解決它?

此外,如果指向一個非常好的正則表達式的Java頁面是共享的,我也會很感激。

謝謝貢獻者..

編輯

我知道它不工作時我用下面的代碼的原因:

Pattern p = Pattern.compile("\\s+"+keyword+"s\\s+|\\s+"); 
      Matcher m = p.matcher(myInputDataSting); 
      if(m.find()) 
      { 
       System.out.println("Its a Match: "+m.group()); 
} 

這將返回一個空字符串...

+0

它不起作用?缺少什麼字符串? – 2012-02-18 16:42:17

+0

您需要將備選選項加括號,但在您的情況下更好地執行'+'s?\\ s +「'以使's'可選。另外,請確保'+ Pattern.quote(關鍵字)+'您的關鍵字,否則它們可能會混淆您的模式。 – Irfy 2012-02-18 16:47:31

+0

我經常使用[this](http://www.regular-expressions.info/tutorial.html)網站作爲教程/參考 – Vic 2012-02-18 16:55:18

回答

4

如果keyword"face",那麼您當前的正則表達式是

\s+faces\s+|\s+ 

它匹配一個或多個空白字符,然後faces,接着是一個或多個空白字符,或一個或多個空格字符。你真的想要什麼(|具有非常低優先級的管道。)

\bfaces?\b 

其中一個單詞邊界,其次是face匹配,任選隨後s,其次是單詞邊界。

所以,你可以寫:

Pattern p = Pattern.compile("\\b"+keyword+"s?\\b"); 

(不過顯然這隻會像face詞通過簡單地添加s形成它們的複數工作)。

您可以在http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html找到Java的正則表達式支持的完整列表,但它不是一個教程。爲此,我建議只使用谷歌搜索「正則表達式教程」,並找到一個適合你的。 (它不一定是特定於Java的:大多數教程都是針對正則表達式的,其類似非常類似於Java的。)

0

應使用

圖案P = Pattern.compile( 「\ B」 +關鍵字+ 「S \ B'」);

,其中關鍵字不是複數。 \\ b表示關鍵字必須在搜索字符串中作爲完整的單詞。 S'意味着關鍵字的值可能以s結尾。

如果您對正則表達式不夠熟悉,我推薦閱讀http://docs.oracle.com/javase/tutorial/essential/regex/index.html,因爲有示例和解釋。