Шаблон регулярного выражения для извлечения номеров версий из строки - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь извлечь номера версий из строкового шаблона, подобного этому

"FasterXML jackson-databind через 2.8.10 и 2.9.x через 2.9.3 позволяет удаленное выполнение кода без проверки подлинности из-за неполного исправления ошибки десериализации CVE-2017-7525. Это можно использовать, отправляя злонамеренно созданный вход JSON в метод readValue ObjectMapper, обходящий черный список, который неэффективен, если в classpath доступны библиотеки 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 Ответ

2 голосов
/ 07 апреля 2019

Я не особо знаком со 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}, чтобы указать, что у нас либо третья группа, либо однажды, или ее нет совсем.

Надеюсь, это поможет.Если вы хотите уточнить свои требования, я могу изменить свой ответ так, чтобы он соответствовал:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...