有效的方法匹配大于最大字符串限制的 OutputStream 上的正则表达式模式
Efficient way match a regex Pattern on an OutputStream greater than max String limit
我正在尝试找到一种有效的方法来对大小超过 String's 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,问题就变成了:
- 将
baos
送入多个字符串。
- "Sliding" 模式匹配这些多个字符串的串联(即原始
baos
内容)。
第 2 步看起来比第 1 步更具挑战性,但我知道像 Unix sed 这样的实用程序只是在文件上执行此操作。
实现该目标的正确方法是什么?
您可以编写一个简单的包装器 class 来从流中实现 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
时,边缘明显粗糙,但它应该适用于大多数情况,您可以针对不适用的情况进行调整。
我正在尝试找到一种有效的方法来对大小超过 String's 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,问题就变成了:
- 将
baos
送入多个字符串。 - "Sliding" 模式匹配这些多个字符串的串联(即原始
baos
内容)。
第 2 步看起来比第 1 步更具挑战性,但我知道像 Unix sed 这样的实用程序只是在文件上执行此操作。
实现该目标的正确方法是什么?
您可以编写一个简单的包装器 class 来从流中实现 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
时,边缘明显粗糙,但它应该适用于大多数情况,您可以针对不适用的情况进行调整。