如何使这个正则表达式与键值对的顺序无关

亚历克斯

我构建了这个正则表达式来从自动生成的锁文件中提取包的版本号:

\[\[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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章