【问题标题】:Regex to match conan dependency from conanfile.txt正则表达式匹配来自 conanfile.txt 的柯南依赖
【发布时间】:2022-10-07 01:33:20
【问题描述】:

我正在尝试在 Java 中创建一个正则表达式来匹配并获取每个依赖项的名称、版本、通道和所有者,但我无法拥有一个涵盖所有可能场景的内容:

该结构类似于name/version@owner/channel,其中版本可能具有 semver 结构,所有者和频道是可选的。

目前,我有:

^(?<name>[\\d\\w][\\d\\w\\+\\.-]+)\\/(?<version>[\\d\\w][\\d\\w\\.-]+)(@(?<owner>\\w+))?(\\/(?<channel>.+))?$

但是boost_atomic/1.59.0+4@owner/release 失败了,因为+4 不匹配,我需要之前的值-> 1.59.0

其他一些需要有效且对上述正则表达式有效的场景是:

Poco/1.9.0@pocoproject/stable
zlib/1.2.11@conan/stable
freetype/2.10.1/stable
openssl/1.0.2g/stable
openssl/1.0.2g
openssl/1.0.2g@owner

此外, cmets 可能存在一些依赖关系:

zlib/1.2.11@conan/stable # comment

在那种情况下,我需要摆脱组件,只使用正则表达式获取相关信息。

我不确定我当前的正则表达式是否良好,但从我测试的结果来看,只有一些场景缺失

    标签: java regex conan


    【解决方案1】:

    您可以简化您的正则表达式并避免在该字符集中放置太多字符并转义它们,而是使用[^\/] 之类的东西来捕获除/ 之外的任何内容,因为您想捕获斜线之前的任何内容。

    我已经进行了一些修改,并且应该为您工作的更新正则表达式如下,

    ^(?<name>[^\/]+)\/(?<version>[^\/@\s]+)(@(?<owner>\w+))?(\/(?<channel>\S+))?(?:\s*#\s*(?<comment>.+))?$
    

    正如您提到的,我添加了另一个命名组以供评论,也可以存在。让我知道这是否适合您。

    Try this demo

    编辑:如果频道包含release:132434 之类的文本,并且任何后跟冒号的内容都将作为频道的一部分被忽略,您可以使用下面更新的正则表达式,

    ^(?<name>[^\/]+)\/(?<version>[^\/@\s]+)(?:@(?<owner>\w+))?(?:\/(?<channel>[^:\s]+)\S*)?(?:\s*#\s*(?<comment>.+))?\s*$
    

    Updated Demo

    【讨论】:

    • 检查更多示例,我发现通道可能基本上类似于 `/release:132434':后跟一个字符串,有没有办法删除该值并仅获取通道值?
    • 是的,正如您所说,您可能有一个冒号分隔的字符串,您不想将其捕获为通道,您可以这样做。我将更新我的答案以将其包含在我的正则表达式中
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多