【问题标题】:powershell regex capture to pull version numberpowershell 正则表达式捕获以提取版本号
【发布时间】:2014-09-02 22:37:40
【问题描述】:

我很难理解 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 正则表达式感到非常困惑。

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    您只需在模式的最后添加.*

    .*_(\d+(\.\d+){1,3}).*
    

    所以你的代码是,

    -replace '.*_(\d+(\.\d+){1,3}).*', '$1')
    

    DEMO

    默认情况下,所有语言的替换功能应该只替换匹配的字符。您的正则表达式 .*_(\d+(\.\d+){1,3}) 匹配版本号中的最后一位。它与其余部分不匹配。因此,每当您将匹配的字符替换为 $1 时,尾随部分 _Prod 应该与第一个捕获组内的字符一起打印,因为尾随部分不匹配。只需匹配尾随部分,以便将整行替换为 $1(ie; 版本号)。

    【讨论】:

    • 只需在演示站点的正则表达式中删除最后一个.*。您应该会看到差异。
    • 太棒了,这不仅可以完美运行,而且您还设法帮助我理解为什么我尝试的任何方法都不起作用。
    • 解释是因为Also, it would be greatly appreciated if you could explain why the regex works as I'm extremely confused by PS regexes at this point. 求解释就好了。
    • 谢谢。还要感谢该网站的链接,我在搜索在线工具时并没有碰巧使用该网站,但它似乎比我使用的工具好得多,因为它解释了正则表达式及其工作原理。
    • 是的,我认为这是最好的在线正则表达式网站。
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多