Эффективный способ сопоставления с шаблоном регулярного выражения в OutputStream, превышающем максимальное ограничение строки - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь найти эффективный способ сопоставления с шаблоном для ByteArrayOutputStream, размер которого превышает максимальный размер строки .

Выполнение сопоставления с шаблоном для ByteArrayOutputStream, который подходит для одногоСтрока тривиальна:

private boolean doesStreamContainPattern(Pattern pattern, ByteArrayOutputStream baos) throws IOException {

    /*
     *  Append external source String to output stream...
     */

    if (pattern != null) {
        String out = new String(baos.toByteArray(), "UTF-8");
        if (pattern.matcher(out).matches()) {
            return true;
        }
    }

    /*
     *  Some other processing if no pattern match
     */
    return false;
}

Но если размер baos превышает максимальный размер строки, проблема превращается в:

  1. Подача baos в несколько строк.
  2. «Скользящий» шаблон сопоставления по конкатенации этих нескольких строк (то есть оригинальное содержание baos).

Шаг 2 выглядит более сложным, чем Шаг 1, но я знаю, что такие утилиты, какUnix sed делает именно это с файлом.

Как правильно это сделать?

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете написать простой класс-обертку для реализации CharSequence из потока:

class ByteArrayCharSequence implement CharSequence {
    private byte[] array;
    public StreamCharSequence(byte[] input) {
        array = input;
    }

    public char charAt(int index) {
        return (char) array[index];
    }
    public int length() {
        return array.length;
    }
    public CharSequence subSequence(int start, int end) {
        return new ByteArrayCharSequence(Arrays.copyOfRange(array, start, end));
    }
    public String toString() {
        // maybe test whether we exceeded max String length
    }
}

и затем сопоставить по

private boolean doesStreamContainPattern(Pattern pattern, ByteArrayOutputStream baos) throws IOException {
    if (pattern != null) {
        CharSequence seq = new ByteArrayCharSequence(baos.toByteArray());
        if (pattern.matcher(seq).matches()) {
            return true;
        }
    }

    /*
     *  Some other processing if no pattern match
     */
    return false;
}

Очевидно, что по краям с помощью броскадо char и с использованием copyOfRange, но это должно работать в большинстве случаев, и вы можете настроить для тех, где это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...