我试图用正则表达式验证CPE 2.3名称。CPE 2.3名称的基本结构如下:
cpe:2.3:part:vendor:product:version:update:edition:lang:sw_edition:target_sw:target_hw:other零件、供应商、产品、版本等。可以由一系列字母数字字符、数字和标准中定义的一些特殊字符组成。
我目前面临的问题是允许在这些字段(供应商、产品等)中使用转义冒号(\:)。因此,我不能使用量词来检查CPE中是否存在正确的字段数量。
示例
Regex = cpe\:2\.3\:[aho](\:[a-zA-Z0-9\!\"\#\$\%\&\'\(\)\*\+\,\-\_\.\/\;\<\=\>\?\@\[\\\]\\^\`\{\|\}\~]+)\g<1>{9}用这个regex验证以下CPE名称很好:
cpe:2.3:a:1024cms:1024_cms:1.4.1:*:*:*:*:*:*:*但是,使用相同的正则表达式验证下面的CPE名称会失败,因为由于CPE的产品字段中的\:序列导致量词错误。
cpe:2.3:a:alawar:motor_town\\:_machine_soul_free:1.1:*:*:*:*:android:*:*匹配失败的另一个示例如下:
cpe:2.3:a:lemonldap-ng:lemonldap\\:\\::0.6:*:*:*:*:*:*:*在这里,由于\:序列,匹配仍然失败,但是由于另一个原因,因为现在第一个捕获组的+量词不满足。
如何在不使用贪婪量词的情况下正确匹配这样的CPE?
发布于 2016-05-18 14:09:00
这个regex应该能做到这一点:
cpe:2\.3:[aho](?::(?:[a-zA-Z0-9!"#$%&'()*+,\\\-_.\/;<=>?@\[\]^`{|}~]|\\:)+){10}$请参阅现场演示
这部分特别有趣:
(?::(?:[a-zA-Z0-9!"#$%&'()*+,\\\-_.\/;<=>?@\[\]^`{|}~]|\\:)+)因为它允许输入几乎是值中的所有内容或\:。
发布于 2018-03-31 13:54:00
官方CPE模式指定此regex:
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}参考资料:2.3.xsd
https://stackoverflow.com/questions/37298968
复制相似问题