正则表达式模式从字符串中提取版本号

时间:2019-04-07 16:59:51

标签: java scala

我正在尝试从这样的字符串模式中提取版本号

“ 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

1 个答案:

答案 0 :(得分:1)

我对Scala并不是特别熟悉,所以我不确定为什么RegEx周围有这么多报价。我将超越此范围,尝试使用未转义的RegEx \d+(\.\d+\.\d+)+处理您的问题。

这将匹配由点分隔的数字组成的单词,并限制数字的数量必须为奇数,并且至少必须有三个。

也就是说,它将匹配1.2.312.23.34.45,但不匹配1.21.2.3.。实际的匹配部分将是后两位。

我猜想您要匹配由两个或三个点分隔的数字组成的字符串,其中第二个和第三个可以是通配符。这应该可以解决问题:

\d+\.(?:\d+|x)(?:\.\d+|x){0,1}

(?:\d+|x)是一个非捕获组(?:),可以是代表通配符的x,也可以是一个或多个数字。

我们还使用{0,1}来指定我们是否拥有第三组,或者根本没有。

我希望这会有所帮助。如果您想澄清您的要求,我可以修改我的答案以适合:)