我正在尝试从这样的字符串模式中提取版本号
“ FasterXML jackson-databind到2.8.10以及2.9.x到2.9.3都允许未经身份验证的远程代码执行,原因是对CVE-2017-7525反序列化漏洞的修复不完整。可通过将恶意制作的JSON输入发送到ObjectMapper的readValue方法,绕过黑名单,如果在类路径中可用Spring库,黑名单将无效。”
请注意,版本号可以包含类似的变体 2.8.x 2.8 2
我想提取所有
我需要检查此字符串以验证我当前的版本是否匹配字符串
中指定的版本。val str = "FasterXML jackson-databind through 2.8.10 and 2.9.x through 2.9.3 allows unauthenticated remote code execution because of an incomplete fix for the CVE-2017-7525 deserialization flaw. This is exploitable by sending maliciously crafted JSON input to the readValue method of the ObjectMapper, bypassing a blacklist that is ineffective if the Spring libraries are available in the classpath."
str: String = "FasterXML jackson-databind through 2.8.10 and 2.9.x through 2.9.3 allows unauthenticated remote code execution because of an incomplete fix for the CVE-2017-7525 deserialization flaw. This is exploitable by sending maliciously crafted JSON input to the readValue method of the ObjectMapper, bypassing a blacklist that is ineffective if the Spring libraries are available in the classpath."
val numbers = """"\\d+(\\.\\d+\\.\\d+)+""".r
答案 0 :(得分:1)
我对Scala并不是特别熟悉,所以我不确定为什么RegEx周围有这么多报价。我将超越此范围,尝试使用未转义的RegEx \d+(\.\d+\.\d+)+
处理您的问题。
这将匹配由点分隔的数字组成的单词,并限制数字的数量必须为奇数,并且至少必须有三个。
也就是说,它将匹配1.2.3
和12.23.34.45
,但不匹配1.2
或1.2.3.
。实际的匹配部分将是后两位。
我猜想您要匹配由两个或三个点分隔的数字组成的字符串,其中第二个和第三个可以是通配符。这应该可以解决问题:
\d+\.(?:\d+|x)(?:\.\d+|x){0,1}
(?:\d+|x)
是一个非捕获组(?:
),可以是代表通配符的x
,也可以是一个或多个数字。
我们还使用{0,1}
来指定我们是否拥有第三组,或者根本没有。
我希望这会有所帮助。如果您想澄清您的要求,我可以修改我的答案以适合:)