我构建了这个正则表达式来从自动生成的锁文件中提取包的版本号:
\[\[package\]\]\s(?:[a-z-]+ = \"?.*\"?\s)*name = \"NAME\"\s(?:[a-z-]+ = \"?.*\"?\s)*version = \"([ab0-9.]+)\"
主题文件看起来像这样(缩短了,有很多这样的块):
[[package]]
category = "main"
description = "Some. , - description"
name = "django"
optional = false
python-versions = ">=3.5"
version = "2.2.17"
[package.dependencies]
django = ">=1.8.0"
redis = ">=3"
rq = ">=0.13,<1.0"
[package.extras]
Sentry = ["raven (>=6.1.0)"]
testing = ["mock (>=2.0.0)"]
这似乎运作良好。问题是有时,两个重要键的顺序可能不同,例如:
[[package]]
category = "main"
description = "Some. , - description"
version = "2.2.17"
optional = false
name = "django"
python-versions = ">=3.5"
这将导致此正则表达式失败。
我想找到一个块([[package]]
以换行符开头和结尾,其中包含 string ^name = \"NAME\"
,并在该块中找到version
键的值,无论它们的顺序如何。
我已经阅读了一些关于前瞻/后视的阅读,但我无法将其应用于此。
您可以使用先行断言来匹配主正则表达式中的包名称和捕获版本:
\[\[package]]\s(?=(?:[a-z-]+ = "?[^"]*"?\s)*?name = "django"\s)(?:[a-z-]+ = "?[^"]*"?\s)*?version = "([ab0-9.]+)"
正则表达式详情:
\[\[package]]\s
: 匹配[[package]]
后跟一个空格(?=(?:[a-z-]+ = "?[^"]*"?\s)*?name = "django"\s)
: 正向前瞻断言我们name = "django"
在这个包中的某处有一个属性(?:[a-z-]+ = "?[^"]*"?\s)*?
: 匹配 0 个或多个属性线version = "([ab0-9.]+)"
:version
在捕获组#1 中匹配属性和捕获版本号本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句