正则表达式从 nuget 包文件名解析包名和版本号
Regex to parse package name and version number from nuget package filenames
我有一个从 nuget.org 下载的 nuget 包目录。我正在尝试创建一个正则表达式,它将从文件名中解析出包名和版本号。乍一看似乎并不难;文件名具有清晰的模式:
{PackageName}.{VersionNumber}.nupkg
尽管边缘情况使其具有挑战性。
- 包名称可以包含破折号、下划线和数字
- 包名称可以有效地由点分隔的无限部分
- 版本号由3-4组数字组成,以点分隔
- 版本号有时带有预发布标签(-alpha、-beta 等)后缀
这是 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.
它可以很好地处理前三个,尽管我不想要尾随的点。它甚至与第四个不匹配,第五个版本号的第一部分与包名称混为一谈。
我将你的表达稍微修改为:
^(.*?)\.((?:\.?[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
要包括整个版本,“.nupkg”之前的所有内容:
^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z0-9]+?\.?)*)\.nupkg$
这为 My.Package.1.2.3.4-pre.1.other-thing
提供了这些组:
My.Package
1.2.3.4-pre.1.other-thing
我有一个从 nuget.org 下载的 nuget 包目录。我正在尝试创建一个正则表达式,它将从文件名中解析出包名和版本号。乍一看似乎并不难;文件名具有清晰的模式:
{PackageName}.{VersionNumber}.nupkg
尽管边缘情况使其具有挑战性。
- 包名称可以包含破折号、下划线和数字
- 包名称可以有效地由点分隔的无限部分
- 版本号由3-4组数字组成,以点分隔
- 版本号有时带有预发布标签(-alpha、-beta 等)后缀
这是 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.
它可以很好地处理前三个,尽管我不想要尾随的点。它甚至与第四个不匹配,第五个版本号的第一部分与包名称混为一谈。
我将你的表达稍微修改为:
^(.*?)\.((?:\.?[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
要包括整个版本,“.nupkg”之前的所有内容:
^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z0-9]+?\.?)*)\.nupkg$
这为 My.Package.1.2.3.4-pre.1.other-thing
提供了这些组:
My.Package
1.2.3.4-pre.1.other-thing