正则表达式只选择模式匹配文件

时间:2016-05-02 02:30:36

标签: javascript regex regex-negation

Ftp服务器在每日的基础上创建了以下文件。

  • FGI_WTYUIO_D_2016_04_16_BS.daily.gzip - BS档案
  • FGI_WTYUIO_D_2016_04_16_BV.daily.gzip - BV档案
  • FGI_GHJK_D_2016_04_16_SATB3.daily.gzip - B3档案
  • FKI_GHJK_D_2016_04_16_SAT.daily.gzip - BV档案
  • FKI_GHJK_D_2016_04_16_SATB3.daily.gzip - B3档案
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - BS档案
  • FKI_GHJK_D_2016_04_16_SSD.daily.gzip - 需要忽略
  • FKI_GHJK_D_2016_04_16_SSDBS.daily.gzip - 需要忽略

所以,基本上有两种文件类型

  • FGI
  • FKI

和每个文件类型的三个报告代码

  • BS
  • BV
  • B3

我需要忽略其余的文件。 (SSD文件)。

我需要在Javascript中编写正则表达式模式来获取这些文件。它有以下变量。

  • fileDate - 日期前。 2016_04_16
  • matchReportCode - ex。 BV,BS,B3

因此,如果 fileDate = 2016_04_15 matchReportCode =' SV' (BS,BV)。然后我应该只获取以下文件。

  • FGI_WTYUIO_D_2016_04_15_BS.daily.gzip - FGI BS档案
  • FGI_WTYUIO_D_2016_04_15_BV.daily.gzip - FGI BV文件
  • FKI_GHJK_D_2016_04_16_SAT.daily.gzip - FKI BV文件
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - FKI BS档案

因此,如果 fileDate = 2016_04_19 matchReportCode =' 3S' (B3,BS)。然后我应该只获取以下文件。

  • FGI_WTYUIO_D_2016_04_15_BS.daily.gzip - FGI BS档案
  • FGI_GHJK_D_2016_04_16_SATB3.daily.gzip - FGI B3档案
  • FKI_GHJK_D_2016_04_16_SATB3.daily.gzip - FKI B3档案
  • FKI_GHJK_D_2016_04_16_SATBS.daily.gzip - FKI BS档案

到目前为止,我只能想出这个。

FileRegex = "F[KG]I_.*_D_" + fileDate + "_[A-z]{0,3}L{0,1}[" + matchReportCode + "]{0,1}.daily.gzip";

有人可以帮忙吗?我是正则表达式的新手。感谢。

2 个答案:

答案 0 :(得分:0)

以下可能会更好一点:

FileRegex = "F[KG]I_[^_]+_D_" + fileDate + "_(?!SSD)[a-zA-Z]{0,3}((B[" + matchReportCode + "])|(?<^FKI.*)).daily.gzip";

这将匹配具有所选fileDate且在所选reportCode之前最多三个字母的FKI和FGI文件名。

其他更改包括将[A-z]更改为[a-zA-Z],这是因为正则表达式字符类范围表达式使用ascii表示,并且在A和z之间存在字符([ - 等])不是按字母顺序排列的(这似乎是你的意图)。

同样.*_变为[^_]+_,这要求除了下划线之外至少有一个字符,防止引擎必须回溯那么多,以及如果另一个更容易编辑正则表达式细分已添加。

我还在最后一段的开头添加了一个否定前瞻(?!SSD),这要求该段不以SSD开头。

结尾处的条件((B[" + matchReportCode + "])|(?<^FKI.*))要求文件与报告代码匹配,或者文件名以FKI开头(后跟任意数量的字符才能返回到末尾)。在字符类(^)之外使用时,[...]是行锚点的起点。

答案 1 :(得分:0)

您可以使用否定lookahead

var fileDate = '2016_04_19';
var matchReportCode = 'BS';
var re = new RegExp('F[KG]I_\\w+_D_' + fileDate + 
  '_(?!SSD)[\\w\\d]*' + matchReportCode + '?\\.daily\\.gzip');

// re.test('FKI_GHJK_D_2016_04_19_SSDBS.daily.gzip') === false
// re.test('FKI_GHJK_D_2016_04_19_SATBS.daily.gzip') === true