我很难理解powershell中的正则表达式。星期五,用户mike-z帮助我使用脚本从一组文件夹中提取数字,并使用这样的命名约定 -
Core_1.1.2
Core_1.3.4
以下正则表达式;
-replace '.*_(\d+(\.\d+){1,3})', '$1')
完美地提取数字(例如“1.1.2”)。
不幸的是,我后来意识到一些文件夹名称有一些其他垃圾文本跟踪版本号(例如Core_1.2.4_Prod)。我试着自己调整上面的正则表达式,使它也忽略了尾随文本,但我没有走得太远。我使用了各种在线正则表达式生成器以及我自己有限的正则表达式体验,但我没有得到任何结果;我能够生成正则表达式,应该捕获我需要的文本,但它们在PowerShell中不起作用。令人遗憾的是,上面的工作正则表达式(如在powershell中工作)在我使用的任何正则表达式工具中失败。
基本上,给出一个像这样的文件夹名称列表
Core_1.1.2
Core_1.2.4_Prod
Core_1.2.6
Core_1.3.1_Prod
Core_1.4.4
我只需捕获版本号。此外,如果你能解释为什么正则表达式有效,我将非常感激,因为我现在对PS正则表达式非常困惑。
答案 0 :(得分:3)
您只需要在模式的最后添加.*
,
.*_(\d+(\.\d+){1,3}).*
所以你的代码就是,
-replace '.*_(\d+(\.\d+){1,3}).*', '$1')
默认情况下,所有语言中的替换功能应仅替换匹配的字符。您的正则表达式.*_(\d+(\.\d+){1,3})
匹配版本号中的最后一位数字。它不会与剩下的部分相匹配。因此,每当您使用$1
替换匹配的字符时,尾随部分_Prod
应与第一个捕获组内的字符一起打印,因为尾部不匹配。只需匹配尾随部分,以便用$1
( ie;版本号)替换整行。