有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正则表达式在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"); 

有一种方法可以搜索regexp bea。*然后像ArrayList一样获取索引。索引

编辑:返回项目很好,但我需要比线性搜索性能更好的东西


共 (6) 个答案

  1. # 1 楼答案

    我不相信有JavaAPI方法可以做到这一点,也没有Apache Commons方法可以做到这一点。然而,你自己动手并不困难

  2. # 2 楼答案

    这将是线程的复兴,但可能对某些人有用。您可能不需要索引,可能下一步将对匹配正则表达式的项执行某些操作,因此您需要索引。但您可以使用Java8流和lambda表达式:

      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());
    

    您可以获取原始列表,将其转换为流,在其上运行一个过滤器,该过滤器运行lambda以匹配您的模式,然后将其转换回列表。但你可以保持它的流和运行。foreach使用另一个lambda表达式对其进行处理

  3. # 3 楼答案

    一种选择是使用Apache Commons CollectionUtils“选择”方法。您需要创建一个谓词对象(一个具有单个“evaluate”方法的对象,该方法使用正则表达式检查匹配项并返回true或false),然后可以在列表中搜索匹配项。但是,它不会返回索引,而是返回一个包含项本身的集合

  4. # 4 楼答案

    这是番石榴的一条班轮:

    final Iterable<String> matches = Iterables.filter(myStrings, Predicates.contains(Pattern.compile("myPattern")));
    
    for (final String matched : matches) {
       ...
    }
    
  5. # 5 楼答案

    有内置的方法吗?据我所知没有。然而,这应该是相当容易做到自己。下面是一些完全未经测试的代码,可以让您了解基本的想法:

    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;
    }
    

    我可能对模式和ListIterator部分的使用有点错误(我从未使用过这两个部分),但这应该给出了基本的想法。您还可以在迭代器上执行简单的for循环,而不是while循环

  6. # 6 楼答案

    赫姆斯基本上是对的。如果需要字符串而不是索引,则可以使用Java 5 foreach循环进行改进:

    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
    }