簡體   English   中英

正則表達式僅選擇模式匹配文件

[英]Regex to Select only Pattern Match Files

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

每個文件類型的三個報告代碼

  • 學士學位
  • BV
  • B3

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

我需要在Javascript中編寫正則表達式模式來獲取這些文件。 具有以下變量。

  • fileDate-日期 2016_04_16
  • matchReportCode-例如 BV,BS,B3

因此,如果fileDate = 2016_04_15matchReportCode ='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_19matchReportCode ='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";

有人可以幫忙嗎? 我是正則表達式的新手。 謝謝。

以下內容可能會更好一些:

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

這將匹配具有所選fileDate的FKI和FGI文件名,並在所選reportCode之前最多三個字母。

其他更改包括將[Az]更改為[a-zA-Z] ,這是因為正則表達式字符類范圍表達式使用了ascii表示,並且A和z之間有不是字母的字符([-等。這似乎是您的意圖)。

此外, .*_成為[^_]+_ ,這要求在下划線之外至少還有一個字符,防止引擎不得不回溯盡可能多的字符,並且如果添加另一個段則使正則表達式更易於編輯。

在最后一個段的開頭,我還添加了一個負前瞻(?!SSD) ,這要求該段不以SSD開頭。

末尾的((B[" + matchReportCode + "])|(?<^FKI.*))或)條件((B[" + matchReportCode + "])|(?<^FKI.*))要求文件與報告代碼匹配,或者文件名以FKI開頭(后跟任意數字)字符返回末尾)。 在字符類( [...] )之外使用時, ^是行錨的起點。

您可以使用負前瞻

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM