docs: public MatchIterator findAll(final int options) {
          //setPosition(0);
          return new MatchIterator() {
              private boolean checked = false;
              private boolean hasMore = false;
  
              @Override
              public boolean hasNext() {
                  if (!checked) check();
                  return hasMore;
              }
  
              @Override
              public MatchResult next() {
                  if (!checked) check();
                  if (!hasMore) throw new NoSuchElementException();
                  checked = false;
                  return Matcher.this;
              }
              @Override
              public void remove() {
                  throw new UnsupportedOperationException("remove() not supported on MatchIterator");
              }
  
              private void check() {
                  hasMore = find(options);
                  checked = true;
              }
  
              @Override
              public int count() {
                  if (!checked) check();
                  if (!hasMore) return 0;
                  int c = 1;
                  while (find(options)) c++;
                  checked = false;
                  return c;
              }
  
              @Override
              public ArrayList<String> asList() {
                  if (!checked) check();
                  ArrayList<String> found = new ArrayList<String>(16);
                  if (!hasMore) return found;
                  found.add(Matcher.this.group());
                  while (find(options)) found.add(Matcher.this.group());
                  checked = false;
                  return found;
              }
          };
      }