2016-07-06 28 views
5

私はArrayList<String>を持っています。これは、与えられた文字列の正しいインデックスを見つけるために繰り返します。基本的に、Stringを指定すると、プログラムはリスト全体を検索し、単語全体が一致するインデックスを見つけ出す必要があります。例えば:私は文字列AAAを与える場合Javaは文字列内の単語全体を一致させます

ArrayList<String> foo = new ArrayList<String>(); 
foo.add("AAAB_11232016.txt"); 
foo.add("BBB_12252016.txt"); 
foo.add("AAA_09212017.txt"); 

だから、私は、インデックス2(最後のものを)取り戻す必要があります。だから私はインデックス0を私に返すようにメソッドを使用することはできません。

私はこのコードを試してみました:

String str = "AAA"; 
String pattern = "\\b" + str + "\\b"; 
Pattern p = Pattern.compile(pattern); 

for(int i = 0; i < foo.size(); i++) { 
    // Check each entry of list to find the correct value 
    Matcher match = p.matcher(foo.get(i)); 

    if(match.find() == true) { 
     return i; 
    } 
} 

は残念ながら、このコードは、ループ内if文を達することはありません。私は何が間違っているのか分かりません。

注:これは、AAA_0921、完全名AAA_09212017.txt、またはそれに固有の文字列の一部を検索した場合にも有効です。

+2

'_'を参照してくださいがOohの – rock321987

+0

...それcharacter..so単語単語境界として文句を言わない行為とみなされ、私は知りませんでした。私は別の表現を調べます。 – syy

+0

あなたは 'return i;'を意味しませんか? – 4castle

答えて

5

単語境界がワード文字の間で一致し、あなたがここ

String pattern = "(?<=_|\\b)" + str + "(?=_|\\b)"; 

を必要と強調していないので、(?<=_|\b)肯定後読みは、ワード境界またはstrの前に表示されるように、アンダースコアを必要とし、(?=_|\b)肯定先読みが必要ですアンダースコアまたは単語境界がstrの直後に表示されます。

this regex demoを参照してください。内部に特殊な文字を有することができる、あなたの言葉は、あなたがよりストレートフォワードワード境界を使用する場合があります場合は

:ここ

"(?<![^\\W_])" + Pattern.quote(str) + "(?![^\\W_])" 

を単語文字は除いてある場合には、負の後読み(?<![^\\W_])は試合を失敗しますアンダースコア([^...]は、このクラス内で定義されている文字、範囲など以外の文字に一致する無効化された文字クラスであるため、非ワードの文字\Wおよび_以外のすべての文字に一致します)、および(?![^\W_])否定先読みstrの後のアンダースコア以外の単語がある場合は一致しません。

2番目の例では、引用符で囲まれた検索文字列があるため、AA.A_str.txtでもAA.Aとよく一致する可能性があります。

another regex demo

+0

ありがとうございました!これはそれを機能させた。表現のさまざまな部分について説明できますか?私は 'regex'にかなり新しいです。もしそうでなければ、それは大丈夫です、私はそれを見ることができます。 – syy

+1

@Flow素晴らしいツールの1つは[regex101.com](http://www.regex101.com)です。右上のパネルを見ると、与えた正規表現が説明されています。確かに、Java正規表現はサポートしていませんが、通常はPCREに近いです。 – 4castle

+2

私は列車コンパートメントのラップトップのために私の息子と戦っています、そして私はもちろん試みます:) –

関連する問題