#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, я внес изменения. Спасибо 🙂