Regex не может разобрать версию - PullRequest
0 голосов
/ 12 января 2019

Моя цель - получить номер версии из строки, где строка может содержать что угодно. Вот мой пример набора данных:

Version 1.32.0.1
Version 1.32.0.1c
Version 1.32.1
Version 1.33.2e
Version 1.32

Я пытался сопоставить это с этим регулярным выражением (\d+\.\d+(?:\.\d+)?)(\w?), но я не могу понять, почему это не будет соответствовать 4-му десятичному значению, даже с описательной разбивкой, предоставленной regex101 .com.

Что я неправильно понимаю в этом регулярном выражении, которое заставляет его не соответствовать всем вариантам версии?

Ответы [ 3 ]

0 голосов
/ 12 января 2019

В настоящее время вы использовали ? в группе без захвата, которая будет соответствовать только 3-му десятичному значению (даже если у вас есть 3-е и 4-е десятичное значение). Одним из решений было бы использование * вместо ? в non-capturing group, чтобы ваша группа без захвата соответствовала 3-му, а также 4-му десятичному значению.

Я пробовал в Scala, и он отлично работает для ваших входов выше:

  val text: String = "Version 1.32.0.1c"
  val pattern = """(\d+\.\d+(?:\.\d+)*)(\w?)""".r
  val res: Regex.MatchIterator = pattern.findAllIn(text)
  println(res.group(1)) // 1.32.0.1
  println(res.group(2)) // c
0 голосов
/ 13 января 2019

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

\w+[.](\w*[.]?)*

В текстовом блоке:

Version 1_32.0.1
Version 1.32.0.1c
Version 1.32.1
Version 1.33.2e.
Version 1.32
Version e342

соответствует только номерам версий, которые начинаются с любых буквенно-цифровых символов (и подчеркиваний), за которыми следует одна точка и в цикле, за которыми следует ноль или множество любых буквенно-цифровых символов с точкой в ​​конце строки.

Вот демо: регулярное выражение

0 голосов
/ 12 января 2019

Подсчитайте, сколько \d+ у вас есть. Вы должны посчитать 3. Таким образом, ваше регулярное выражение будет максимально соответствовать 3 числам и не может совпадать с 4.

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

(\d+\.\d+(?:\.\d+(?:\.\d+)?)?)(\w?)

Это можно сократить до:

\d+(?:\.\d+){1,3}(\w?)

Если вы хотите сопоставить любое количество чисел больше 1, вы можете сделать:

\d+(?:\.\d+)+(\w?)

\w будет соответствовать _. Если вы не хотите этого, вы можете заменить его на [a-z].

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