我正在尝试使用正则表达式验证 CPE 2.3 名称。CPE 2.3名称的基本结构如下:
cpe:2.3:part:vendor:product:version:update:edition:lang:sw_edition:target_sw:target_hw:other
Run Code Online (Sandbox Code Playgroud)
零件、供应商、产品、版本等。可以由一系列字母数字字符、数字和标准中定义的一些特殊字符组成。
我目前面临的问题是允许在这些字段(供应商、产品等)中使用转义冒号(\:)。因此,我无法使用量词来检查 CPE 中是否存在正确数量的字段。
[例子]
Regex = cpe\:2\.3\:[aho](\:[a-zA-Z0-9\!\"\#\$\%\&\'\(\)\*\+\,\-\_\.\/\;\<\=\>\?\@\[\\\]\\^\`\{\|\}\~]+)\g<1>{9}
Run Code Online (Sandbox Code Playgroud)
使用此正则表达式验证以下 CPE 名称效果很好:
cpe:2.3:a:1024cms:1024_cms:1.4.1:*:*:*:*:*:*:*
Run Code Online (Sandbox Code Playgroud)
但是,使用相同的正则表达式验证以下 CPE 名称会失败,因为由于 CPE 的产品字段中的 \: 序列导致量词错误。
cpe:2.3:a:alawar:motor_town\\:_machine_soul_free:1.1:*:*:*:*:android:*:*
Run Code Online (Sandbox Code Playgroud)
匹配失败的另一个例子如下:
cpe:2.3:a:lemonldap-ng:lemonldap\\:\\::0.6:*:*:*:*:*:*:*
Run Code Online (Sandbox Code Playgroud)
这里,由于 \: 序列,匹配仍然失败,但原因不同,因为现在第一个捕获组的 + 量词不满足。
如何在不使用贪婪量词的情况下正确匹配这样的 CPE?
regex ×1