首页 > 解决方案 > 有效方式匹配大于最大字符串限制的输出流上的正则表达式模式

问题描述

我试图找到一种有效的方法来对大小超过String 的 max size的 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超过了String max size,问题就变成了:

  1. baos入多个字符串。
  2. baos在这些多个字符串(即原始内容)的串联上“滑动”模式匹配。

第 2 步看起来比第 1 步更具挑战性,但我知道像 Unix sed这样的实用程序只是在文件上执行此操作。

实现这一目标的正确方法是什么?

标签: javastringoutputstream

解决方案


您可以编写一个简单的包装类来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使用 cast to和 using的边缘显然很粗糙copyOfRange,但它应该适用于大多数情况,您可以针对不适用的情况进行调整。


推荐阅读