web-dev-qa-db-ja.com

Java arraylistで正規表現を検索します

ArrayList <String> list = new ArrayList(); 
list.add("behold");
list.add("bend");
list.add("bet");
list.add("bear");
list.add("beat");
list.add("become");
list.add("begin"); 

正規表現bea。*を検索し、ArrayList.indexOfのようにインデックスを取得する方法がありますか?

編集:アイテムを返すことは問題ありませんが、線形検索よりもパフォーマンスの高いものが必要です

15
kmilo

Hermsは基本を正しく理解しました。インデックスではなく文字列が必要な場合は、Java 5foreachループを使用して改善できます。

import Java.util.regex.Pattern;
import Java.util.ListIterator;
import Java.util.ArrayList;

/**
 * Finds the index of all entries in the list that matches the regex
 * @param list The list of strings to check
 * @param regex The regular expression to use
 * @return list containing the indexes of all matching entries
 */
List<String> getMatchingStrings(List<String> list, String regex) {

  ArrayList<String> matches = new ArrayList<String>();

  Pattern p = Pattern.compile(regex);

  for (String s:list) {
    if (p.matcher(s).matches()) {
      matches.add(s);
    }
  }

  return matches
}
16
DJClayworth

組み込みメソッドはありますか?私が知っていることではありません。ただし、自分で行うのはかなり簡単なはずです。基本的な考え方を示す、完全にテストされていないコードを次に示します。

import Java.util.regex.Pattern;
import Java.util.ListIterator;
import Java.util.ArrayList;

/**
 * Finds the index of all entries in the list that matches the regex
 * @param list The list of strings to check
 * @param regex The regular expression to use
 * @return list containing the indexes of all matching entries
 */
List<Integer> getMatchingIndexes(List<String> list, String regex) {
  ListIterator<String> li = list.listIterator();

  List<Integer> indexes = new ArrayList<Integer>();

  while(li.hasNext()) {
    int i = li.nextIndex();
    String next = li.next();
    if(Pattern.matches(regex, next)) {
      indexes.add(i);
    }
  }

  return indexes;
}

PatternとListIteratorのパーツの使い方が少し間違っているかもしれませんが(どちらも使ったことがありません)、それで基本的な考え方がわかります。イテレータでwhileループの代わりに単純なforループを実行することもできます。

8
Herms

これはグアバのワンライナーです:

final Iterable<String> matches = Iterables.filter(myStrings, Predicates.contains(Pattern.compile("myPattern")));

for (final String matched : matches) {
   ...
}
3
grinch

これを行うためのJava APIの方法も、これを行うためのApache Commonsの方法もありません。しかし、自分でロールするのは難しいことではありません。

1
SCdF

これはスレッドの復活になりますが、誰かに役立つかもしれません。インデックスは必要ないかもしれません。おそらく次のステップでは、正規表現に一致するアイテムに対して何かを実行するため、インデックスを要求しました。ただし、Java8ストリームとラムダ式を使用できます。

  import Java.util.regex.Pattern;
  import Java.util.stream.Collectors;
  import Java.util.List;

  ...

  var pattern = Pattern.compile(define);  // var is Java 10 feature

  List<String> list = originalList
      .stream()
      .filter(e -> pattern.matcher(e).matches())
      .collect(Collectors.toList());

元のリストを取得してストリームに変換し、ラムダを実行してパターンに一致するフィルターを実行し、リストに戻すことができます。ただし、ストリームとして保持し、別のラムダ式を使用して.foreachを実行できます。

0
muni764