Шаблон регулярных выражений для извлечения номеров версий из строки

#java #scala

#java #scala

Вопрос:

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

«FasterXML jackson-databind через 2.8.10 и 2.9.x через 2.9.3 допускает удаленное выполнение кода без проверки подлинности из-за неполного исправления ошибки десериализации CVE-2017-7525. Это можно использовать, отправляя злонамеренно созданный ввод JSON в метод readValue ObjectMapper, минуя черный список, который неэффективен, если библиотеки Spring доступны в classpath.»

Обратите внимание, что номер версии может содержать варианты типа 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. У вас слишком много кавычек.

Ответ №1:

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

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

Комментарии:

1. Спасибо Оливеру … Я также 2.x изменил выражение, чтобы оно соответствовало val numbers = """d .(?:d |x)(?:.(?:d |x)){0,1}""".r Однако, оно плохо работает, когда я хотел бы сопоставить выражения типа 2 (без точечной записи) val numbers = """d (?:.(?:d |x)(?:.(?:d |x))){0,1}""".r В последнем случае он превышает оценки и результаты, полученные в гораздо большем количестве совпадений, чем первый, достаточно хорош

2. Оливер, не могли бы вы отредактировать свой шаблон выше d .(?:d |x)(?:.(?:d |x)){0,1}

3. Хорошее место @conikeec, я внес изменения. Спасибо 🙂