2012-02-18 13 views
0

私は100000文字以上の文字列を読み込むためにJavaで作業しています。 私は、文字列を検索するキーワードのリストを持っています。文字列が存在する場合は、内部処理を行う関数を呼び出します。正規表現が正確なパターンを抽出していない

私が持っているキーワードの種類は、たとえば「facebook」ではなく、「faces」に一致するすべてのパターンを取得したいとします。私は文字列の中で顔の後ろの空白文字を受け入れることができます。文字列内にあれば、「顔」「顔」「顔」「顔」のようなマッチがあります。しかし、私は、私はキーワードがキーワードの私のリストですが、私は望ましい結果を得ていないのです正規表現

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

を書かれている「duckface」または「duckface」など

を受け入れることはできません。あなたは私の説明を読むことができますし、何が問題かもしれないと私はそれを修正することができます示唆してください?

また、本当に良い正規表現の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

どのように機能しないのですか?それは何文字列ですか? –

+0

あなたは別のオプションをカッコで括る必要がありますが、あなたの場合はオプション 's 'を作るために' +' s?\\ s + "'を実行する方が良いでしょう。また、 '+ Pattern.quote(keyword)+'あなたのキーワードを確認してください。 – Irfy

+0

私はしばしばチュートリアル/リファレンスとして[this](http://www.regular-expressions.info/tutorial.html)サイトを使用します – Vic

答えて

4

keyword"face"の場合、現在の正規表現は

です一の以上の空白文字が続く faces続い いずれか一つ以上の空白文字、、、 又は一つ以上の空白文字と一致
\s+faces\s+|\s+ 

。 (非常に低い優先度を持ち|パイプ。)

あなたが本当にしたい何がfaceに続く単語境界に一致

\bfaces?\b 

で、必要に応じて単語の境界に続いて、sが続きます。

だから、あなたが書くことができます。

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

(明らかにこれは単にsを追加することによって、その複数を形成faceのような言葉のために働くでしょうが)。

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.htmlにJavaの正規表現サポートの包括的なリストがありますが、チュートリアルはそれほどありません。そのためには、正規表現チュートリアルのグーグル・グーグルにお勧めしたいと思います。 (これはJava固有のものである必要はありません。ほとんどのチュートリアルは、正規表現のフレーバーであり、という非常にに似ています。)

0

あなたは

パターンp = Pattern.compile( "\ bの" +キーワードを使用する必要があります+ "S \ B?");

キーワードは複数ではありません。 \\ bはキーワードが検索文字列の完全な単語でなければならないことを意味します。 ?キーワードの値がsで終わる可能性があることを意味します。

正規表現に慣れていない場合は、例と説明があるので、http://docs.oracle.com/javase/tutorial/essential/regex/index.htmlとお読みください。