2015-08-01 3 views
1

У меня есть ftp-входящая конечная точка, где хранится много файлов (не все для меня), поэтому я добавил фильтр-имя-регулярное выражение с различными регулярными выражениями, которые я хочу извлечь из каталога FTP :Mule выражение regex issue

<file:filename-regex-filter pattern=" 
          ${environment}\.TEST.xml, 
          0\.${environment}\.REPD\.(.*).GZ, 
          ${environment}(.*)PERSONNOTI(.*)\.xml\.gz, 
          ${environment}(.*)PERSONNOTI(.*)voucher\.xml" caseSensitive="false" /> 

Это прекрасно работает, но теперь я хочу выполнить конкретное поведение, основанное на типе файла. Поэтому я использую компонент выбора с разными выражениями:

Моя первая идея состояла в том, чтобы использовать компонент выбора, когда выражения, которые используют те же регулярные выражения, которые используются в filename-regex-filter и которые работают там:

<when expression="#[message.inboundProperties.originalFilename.matches('0\.${environment}\.REPD\.(.*).GZ')]"> 
    // Specific behaviour for this type of files 
</when>  

Это произвело следующее сообщение об ошибке:

Exception stack is: 
1. [Error: illegal escape sequence: .] 
[Near : {... age.inboundProperties.originalFilename.matches('0\.T\.REPD\.(.*).GZ') ....}] 
                  ^
[Line: 1, Column: 55] (org.mule.api.expression.InvalidExpressionException) 
    org.mule.el.mvel.MVELExpressionLanguage:238(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/InvalidExpressionException.html) 
2. [Error: illegal escape sequence: .] 
[Near : {... age.inboundProperties.originalFilename.matches('0\.T\.REPD(.*).GZ') ....}]  

Это означает, что выражение атрибута doensn't ожидать избежать символов, поэтому я решил не бежать им

<when expression="#[message.inboundProperties['originalFilename'].matches('${environment}.TEST.xml')]"> 
    //Specific behavior for this type of files...   
</when> 

<when expression="#[message.inboundProperties.originalFilename.matches('0.${environment}.REPD.*.GZ')]"> 
    //Specific behavior for this type of files... 
</when> 

<otherwise> 
    <file:outbound-endpoint path="C:/test/result/other" responseTimeout="10000" outputPattern="#[message.inboundProperties.originalFilename]"/> 
</otherwise> 

Здесь сообщение всегда направляется к иным пунктом, для первого выражения, где не используются специальные символы, кроме ...

Это хорошая практика, чтобы работать с выражениями, когда, и что такое правильный способ выражения выражения?

+1

Ваш вход смешивается с вашим регулярным выражением, поэтому, если вы включаете специальные символы регулярного выражения на входе, они в конечном итоге синтаксис вашего регулярного выражения. Поэтому вам либо нужно правильно вписать их в существующее регулярное выражение, либо избежать их всех: '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' \ 'и так далее. [Каким символам нужно ускользнуть.] (Http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in-regular-expressions). Возможно, ваш язык уже имеет что-то вроде 'Regex.Escape()', как это делают некоторые другие языки. Затем просто используйте его в своей последовательности ввода. – miroxlav

+0

Не могли бы вы переместить его из комментария к вопросу? (Включая код, который вы использовали для экранирования). Это сделает ваш вопрос более полным с вашими исследованиями на сегодняшний день и будет легче ответить тем, кто знает эту область. – miroxlav

ответ

0

Я нашел решение, которое работает на данный момент, но я думаю, что должна быть лучшим решением, используя регулярные выражения:

<file:inbound-endpoint responseTimeout="10000" connector-ref="input" path="C:/test"> 
     <file:filename-regex-filter pattern=" 
          0\.${environment}\.REPD\.(.*).GZ, 
          ${environment}(.*)PERSONNOTI(.*)\.xml\.gz, 
          ${environment}(.*)PERSONNOTI(.*)voucher\.xml" caseSensitive="false" /> 
    </file:inbound-endpoint> 
    <choice> 
     <when expression="#[(message.inboundProperties.originalFilename.toLowerCase()).startsWith('0.${environment}.REPD'.toLowerCase()) &amp;&amp; 
         (message.inboundProperties.originalFilename.toLowerCase()).endsWith('gz')]"> 
      <gzip-uncompress-transformer/> 
      // Specific behaviour for this type of files 
     </when> 
     <when expression="#[(message.inboundProperties.originalFilename.toLowerCase()).startsWith('${environment}'.toLowerCase()) &amp;&amp; 
         (message.inboundProperties.originalFilename.toLowerCase()).contains('personnoti') &amp;&amp; 
         (message.inboundProperties.originalFilename.toLowerCase()).endsWith('.xml.gz')]"> 
      // Specific behaviour for this type of files 
     </when> 
     <when expression="#[(message.inboundProperties.originalFilename.toLowerCase()).startsWith('${environment}'.toLowerCase()) &amp;&amp; 
         (message.inboundProperties.originalFilename.toLowerCase()).contains('personnoti') &amp;&amp; 
         (message.inboundProperties.originalFilename.toLowerCase()).endsWith('voucher.xml')]"> 
      // Specific behaviour for this type of files 
     </when> 
    </choice> 

Я искал в течение нескольких часов в интернете, но не нашел верное решения для моя проблема. Если у кого-то есть идея, как это можно решить с помощью регулярных выражений или других оценщиков, мне очень любопытно ...