我正在使用 Camel 处理目录中的文件。但是,我希望我的 Camel 路由仅处理名称与特定正则表达式模式匹配的文件。因此,我将 include
选项添加到 File2
配置中,并传入所需的正则表达式。
文件名模式的示例:
somerandomname-2017-10-02T13-23-42+02-00.zip
我想出的正则表达式:
^[A-Za-z0-9_]+\-\d{4}\-\d{2}\-\d{2}T\d{2}\-\d{2}\-\d{2}\+\d{2}\-\d{2}\.zip$
我传递给 from(...)
的 File2
组件的字符串:
file://...?include=^[A-Za-z0-9_]+\-\d{4}\-\d{2}\-\d{2}T\d{2}\-\d{2}\-\d{2}\+\d{2}\-\d{2}\.zip$&...
但是,所有 文件都会被忽略。当将正则表达式更改为更简单的表达式(例如 .*\.zip
)时,它会起作用,因此问题肯定与 include
和我的模式有关。我也尝试过不使用开始和结束运算符(^
和 $
),但没有成功:
.*?[A-Za-z0-9_]+\-\d{4}\-\d{2}\-\d{2}T\d{2}\-\d{2}\-\d{2}\+\d{2}\-\d{2}\.zip
感谢任何帮助。
编辑1:我使用String.matches
和Matcher.matches
测试了正则表达式(假设这是Camel内部使用的),没有任何问题。我正在使用当前的 Camel 版本 2.19.3。
编辑2:我试图找到最小的工作模式,虽然 .*?\d{2}\-\d{2}\.zip
仍然有效,但 .* ?\+\d{2}\-\d{2}\.zip
没有。所以看起来它与+
符号有关。
最佳答案
我建议改用过滤选项。这样就可以消除正则表达式被 URL 编码的可能性(我怀疑可能是这种情况)。
public class MyFilter<T> implements GenericFileFilter<T> {
@Override
public boolean accept(GenericFile<T> file) {
if (file.getFileName().matches("^[A-Za-z0-9_]+\-\d{4}\-\d{2}\-\d{2}T\d{2}\-\d{2}\-\d{2}\+\d{2}\-\d{2}\.zip$"))
return true;
return false;
}
}
然后你可以在过滤器选项中引用你的bean,如下所示:
<from uri="file:///someDir?filter=#myFilter" />
关于java - Apache Camel : making a regex work with File2's include filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46524827/