java - 有效方式匹配大于最大字符串限制的输出流上的正则表达式模式
问题描述
我试图找到一种有效的方法来对大小超过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,问题就变成了:
- 馈
baos
入多个字符串。 baos
在这些多个字符串(即原始内容)的串联上“滑动”模式匹配。
第 2 步看起来比第 1 步更具挑战性,但我知道像 Unix sed这样的实用程序只是在文件上执行此操作。
实现这一目标的正确方法是什么?
解决方案
您可以编写一个简单的包装类来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
,但它应该适用于大多数情况,您可以针对不适用的情况进行调整。
推荐阅读
- java - docker swarm 中的分布式 Java 应用程序
- r - 为多个图形创建标准色标
- html - 使 CSS 下拉内容右对齐而不是左对齐
- vb.net - 将当前部署为 Windows 服务的现有 http 中继服务器转换为处理 https 请求
- jupyter - 如何让 Spark2.3 在 Jupyter Notebook 中工作
- windows - EnableDelayedExpansion 仅适用于第一个命令
- c# - 无法将带有 [] 的索引应用于 IConfiguration 类型的表达式
- python - 如何更改此代码以将整数转换为九位二进制字符串?
- excel - 我们如何使用 vba excel 网页抓取在网页上输入日期(日期选择器)
- excel - 如何获得形状中的图片?