Apache Camel:使用File2的include过滤器制作正则表达式

时间:2017-10-02 11:43:59

标签: java regex apache-camel

我正在使用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符号有关。

2 个答案:

答案 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.+$)