我正在尝试使用正则表达式验证 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?
Hum*_*ert 11
官方 CPE 架构指定此正则表达式:
cpe:2\.3:[aho\*\-](:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\*\-]))(:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){4}
Run Code Online (Sandbox Code Playgroud)
参考:https://csrc.nist.gov/schema/cpe/2.3/cpe-naming_2.3.xsd
这个正则表达式应该可以解决问题:
cpe:2\.3:[aho](?::(?:[a-zA-Z0-9!"#$%&'()*+,\\\-_.\/;<=>?@\[\]^`{|}~]|\\:)+){10}$
Run Code Online (Sandbox Code Playgroud)
查看现场演示
这部分特别有趣:
(?::(?:[a-zA-Z0-9!"#$%&'()*+,\\\-_.\/;<=>?@\[\]^`{|}~]|\\:)+)
Run Code Online (Sandbox Code Playgroud)
因为它允许输入几乎是所有内容或在\:值内。