我正在使用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$
我传递给File2
的{{1}}组件的字符串:
from(...)
但是,所有文件都会被忽略。它在将正则表达式更改为更简单的表达式时起作用,例如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
和^
)但没有成功:
$
感谢任何帮助。
编辑1:我用.*?[A-Za-z0-9_]+\-\d{4}\-\d{2}\-\d{2}T\d{2}\-\d{2}\-\d{2}\+\d{2}\-\d{2}\.zip
和String.matches
测试了正则表达式(假设这是Camel在内部使用的)没有任何问题。我正在使用当前的Camel版本2.19.3。
编辑2:我试图找到最小工作模式,虽然Matcher.matches
仍然有效,但.*?\d{2}\-\d{2}\.zip
却没有。所以它似乎与.*?\+\d{2}\-\d{2}\.zip
符号有关。
答案 0 :(得分:2)
我建议使用filter-option代替。这样就可以消除你的正则表达式进行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;
}
}
然后你可以在filter-option中引用你的bean,如下所示:
<from uri="file:///someDir?filter=#myFilter" />
答案 1 :(得分:0)
即使正则表达式已编码,加号'+'
也会由空格' '
代替。
骆驼在quartz2组件中使用骆驼,其中cron表达式由'+'
:cron=0/5+*+*+1/1+*+?+*
解决方案是使用RAW(^myRegex.+$)