Ftp服务器在每日的基础上创建了以下文件。
所以,基本上有两种文件类型
和每个文件类型的三个报告代码
我需要忽略其余的文件。 (SSD文件)。
我需要在Javascript中编写正则表达式模式来获取这些文件。它有以下变量。
因此,如果 fileDate = 2016_04_15 且 matchReportCode =' SV' (BS,BV)。然后我应该只获取以下文件。
因此,如果 fileDate = 2016_04_19 且 matchReportCode =' 3S' (B3,BS)。然后我应该只获取以下文件。
到目前为止,我只能想出这个。
FileRegex = "F[KG]I_.*_D_" + fileDate + "_[A-z]{0,3}L{0,1}[" + matchReportCode + "]{0,1}.daily.gzip";
有人可以帮忙吗?我是正则表达式的新手。感谢。
答案 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