【问题标题】:Regex to Select only Pattern Match Files正则表达式仅选择模式匹配文件
【发布时间】:2023-03-17 01:21:01
【问题描述】:

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 - 例如。 BV,BS,B3

所以,如果 fileDate = 2016_04_15ma​​tchReportCode='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_19ma​​tchReportCode='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";

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

【问题讨论】:

标签: javascript regex regex-negation


【解决方案1】:

你可以使用否定的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

【讨论】:

    【解决方案2】:

    以下可能会好一点:

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

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

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

    另外,.*_ 变成了[^_]+_,这要求除了下划线之外至少有一个字符,防止引擎不得不尽可能多地回溯,并且在添加另一个段时使正则表达式更容易编辑。

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

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

    【讨论】:

    • 如何忽略 SSD 文件?正则表达式也会复制它,对吗?另外,我没有 FKI 类型的 BV 代码 - FKI_GHJK_D_2016_04_16_SAT.daily.gzip -
    • 查看我的更新答案。我不确定缺少的报告代码是否是错字,我无法评论其他帖子以澄清,因为我目前只有 10 个代表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多