正则表达式从 nuget 包文件名解析包名和版本号

Regex to parse package name and version number from nuget package filenames

我有一个从 nuget.org 下载的 nuget 包目录。我正在尝试创建一个正则表达式,它将从文件名中解析出包名和版本号。乍一看似乎并不难;文件名具有清晰的模式:

{PackageName}.{VersionNumber}.nupkg

尽管边缘情况使其具有挑战性。


这是 nuget 包文件名的示例列表:

knockoutjs.3.4.2.nupkg
log4net.2.0.8.nupkg
runtime.tizen.4.0.0-armel.microsoft.netcore.jit.2.0.0.nupkg
nuget.core.2.7.0-alpha.nupkg
microsoft.identitymodel.6.1.7600.16394.nupkg

我希望能够在 Serious Text Editor 中执行 search/replace,其中搜索是一个包含两组的正则表达式,一组用于包名称,另一组用于版本号。输出应该是 "Package: Version: "。使用上面的 5 个包,输出应该是:

Package: knockoutjs Version: 3.4.2
Package: log4net Version: 2.0.8
Package: runtime.tizen.4.0.0-armel.microsoft.netcore.jit Version: 2.0.0
Package: nuget.core Version: 2.7.0-alpha
Package: microsoft.identitymodel Version: 6.1.7600.16394

我想出的最接近的相对简洁的正则表达式是:

^([^\s]*)\.((?:[0-9]+\.){3,})nupkg$

...导致以下输出:

Package: knockoutjs Version: 3.4.2.
Package: log4net Version: 2.0.8.
Package: runtime.tizen.4.0.0-armel.microsoft.netcore.jit Version: 2.0.0.
nuget.core.2.7.0-alpha.nupkg
Package: microsoft.identitymodel.6 Version: 1.7600.16394.

它可以很好地处理前三个,尽管我不想要尾随的点。它甚至与第四个不匹配,第五个版本号的第一部分与包名称混为一谈。

Save the day!

我将你的表达稍微修改为:

^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$

主要是我把第一个非捕获组的数字前面的.移了,我在第四个字符串中为-alpha添加了一个可选的非捕获组。

替换为:

Package:  Version: 

实时测试正则表达式 here

我认为这个正则表达式可以满足您的要求:

^(.*?)\.(?=(?:[0-9]+\.){2,}[0-9]+(?:-[a-z]+)?\.nupkg)(.*?)\.nupkg$

它使用正向先行查找版本号,后跟(可能)格式为 -[a-z]+(例如 -alpha)的标记,然后是 \.nupkg。最后一部分阻止它与第三个示例中的 4.0.0-armel 匹配。对于你的边缘情况,用 Package: Version: 代替输出是:

Package: knockoutjs Version: 3.4.2
Package: log4net Version: 2.0.8
Package: runtime.tizen.4.0.0-armel.microsoft.netcore.jit Version: 2.0.0
Package: nuget.core Version: 2.7.0-alpha
Package: microsoft.identitymodel Version: 6.1.7600.16394

Demo

要包括整个版本,“.nupkg”之前的所有内容:

^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z0-9]+?\.?)*)\.nupkg$

这为 My.Package.1.2.3.4-pre.1.other-thing 提供了这些组:

  1. My.Package
  2. 1.2.3.4-pre.1.other-thing