PowerShell 正则表达式仅从字符串返回 8 个连续的数字

PowerShell 正则表达式仅从字符串返回 8 个连续的数字

我无法使用以下方法返回字符串代替()我需要获取数字,但只能从连续 8 个字符并排组中的数字中获取。

其中一些字符串将包含其他数字,但这些数字永远不会出现在 8 组集合中,所以我想省略这些数字并仅返回 8 位数字组中的数字。

在此处输入图片描述

澄清

这些字符串实际上是文件名,但如果我能从这个简单的示例中得到一些关于预期结果的帮助,我可以轻松地将其合并到其他电源外壳脚本过程的逻辑。

  • 我宁愿不使用YYYY当前年份$YYYY = (get-date).year或类似的内容,然后寻找其他数字,这样文件名本身就可以决定操作,而不是年份

  • TRUE我尝试了各种方法,甚至使用 IN think"[^0-9]{8}.*$或类似方法返回了一些方法,但没有一种方法可以轻松地返回实际的 8 位数字。


示例数据字符串

error_PP3_XXX_PSI_20180109PM.err
error_PP3_XXX_PSI_20180110AM.err
error_PP3_XXX_PSI_20180111PM.err
error_PP3_XXX_PSI_20180115PM.err
error_PP3_XXX_Temp_20180110AM.err
error_YYY_20180109AM.err
error_YYY_20180109PM.err

电源外壳

  • 正确结果

    这是一个工作示例,其中字符串中只有 8 个连续的数字

    "error_YYY_20180109PM.err" -replace "[^0-9]" , ""
    

    结果

    20180109
    
  • 结果不正确

    这是一个不起作用的示例,其中字符串中除了 8 个连续的数字外,还包含其他数字字符

    "error_PP3_XXX_PSI_20180115PM.err" -replace "[^0-9]" , ""
    

    结果

    320180115
    

答案1

这应该有效
if ("error_PP3_XXX_PSI_20180109PM.err" -match "([0-9]{8})"){$matches[1]} else {""}

假设您没有多于一组 8 位数字。还请注意,即使以下命令不匹配,$matches 仍保持设置。因此,您可能需要使用clear-variable matches(或使用更短的别名clv matches)手动清除它

相关内容