Вернуть пять символов до и после матча в регулярном выражении [закрыто]

Вот довольно простая реализация, которая запускает PropertyChangeEvent s при чтении дополнительных байтов. Некоторые предостережения:

  • Класс не поддерживает операции mark или reset, хотя их было бы легко добавить.
  • Класс не проверяет, число байтов, считанных когда-либо превышающее максимальное количество ожидаемых байтов, хотя это всегда может быть обработано кодом клиента при отображении прогресса.
  • Я не тестировал код.

Код:

public class ProgressInputStream extends FilterInputStream {
    private final PropertyChangeSupport propertyChangeSupport;
    private final long maxNumBytes;
    private volatile long totalNumBytesRead;

    public ProgressInputStream(InputStream in, long maxNumBytes) {
        super(in);
        this.propertyChangeSupport = new PropertyChangeSupport(this);
        this.maxNumBytes = maxNumBytes;
    }

    public long getMaxNumBytes() {
        return maxNumBytes;
    }

    public long getTotalNumBytesRead() {
        return totalNumBytesRead;
    }

    public void addPropertyChangeListener(PropertyChangeListener l) {
        propertyChangeSupport.addPropertyChangeListener(l);
    }

    public void removePropertyChangeListener(PropertyChangeListener l) {
        propertyChangeSupport.removePropertyChangeListener(l);
    }

    @Override
    public int read() throws IOException {
        int b = super.read();
        updateProgress(1);
        return b;
    }

    @Override
    public int read(byte[] b) throws IOException {
        return (int)updateProgress(super.read(b));
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        return (int)updateProgress(super.read(b, off, len));
    }

    @Override
    public long skip(long n) throws IOException {
        return updateProgress(super.skip(n));
    }

    @Override
    public void mark(int readlimit) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void reset() throws IOException {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean markSupported() {
        return false;
    }

    private long updateProgress(long numBytesRead) {
        if (numBytesRead > 0) {
            long oldTotalNumBytesRead = this.totalNumBytesRead;
            this.totalNumBytesRead += numBytesRead;
            propertyChangeSupport.firePropertyChange("totalNumBytesRead", oldTotalNumBytesRead, this.totalNumBytesRead);
        }

        return numBytesRead;
    }
}
-2
задан MaZoli 18 January 2019 в 10:49
поделиться

1 ответ

Если вы хотите сопоставить контекст и строку поиска, просто добавьте необязательный диапазон до и после искомой строки: .{0,5}der.{0,5}

Если вы хотите получить только контекст, вам нужно его извлечь отдельно: (.{0,5})der(.{0,5})

0
ответ дан Carsten Franke 18 January 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: