Regex, чтобы найти версию файла C # - PullRequest
0 голосов
/ 28 февраля 2019

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

1] 2.13.1801.221 Ожидаемый вывод - [Version: 2.13.1801.221 and Type: Null]

2] 2.17.1801.221.SQLServer Ожидаемый вывод - [Version: 2.17.1801.221 and Type: SQLServer]

3] 2.19.1801.SQLite Ожидаемый вывод - [Version: 2.19.1801 and Type: SQLite]

Я использую приведенное ниже регулярное выражение для извлечения версии и типа из имени файла

^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$

Но это не работает.

Протестировано с помощью регулярного выражения онлайн, которое показывает результат в виде: [https://i.stack.imgur.com/c9FlW.png]

Группы совпадений, сформированные как: [https://i.stack.imgur.com/V0azi.png]

Что мне здесь не хватает?пожалуйста, предложите несколько хороших регулярных выражений.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы всегда предполагаете, что после номеров версий будет ..Однако если после версии не указан тип, дополнительный . не будет существовать.Поэтому вместо этого вы можете использовать следующее:

^(?<version>[\d+\.]+\d)\.*(?<type>\w*)$

Демо

  • ^ соответствует началу строки

  • Группа захвата версии определяется как (?<version>[\d+\.]+\d)

    • [\d+\.]+ соответствует 1+ числу цифр, следующим за . для 1+ число раз
    • \d соответствует последней цифре
  • \.* соответствует типу, указанному после номеров версии

  • Тип группы захвата определяется как (?<type>\w*)

    • \w* соответствует любому количеству символов слова
  • $ соответствует концулинии

0 голосов
/ 28 февраля 2019

Ваше регулярное выражение немного неверно, поэтому оно не работает.Вот правильное регулярное выражение, которое вы должны использовать:

^(?<version>\d+(?:\.\d+)+)(?:\.(?<type>[a-zA-Z]+))?$

Демо

Вот объяснение проблем в вашем ^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$ регулярном выражении,

  • Этот (\d+\.\d+)+ в вашем регулярном выражении не будет правильно захватывать версию, так как он будет ожидать данных типа одна или несколько цифр, за которыми снова следует буквальная точка, а затем одна или несколько цифр и целая ееодин или несколько раз.Исправленной версией этой части будет эта \d+(?:\.\d+)+, которая может захватывать строки типа 1.1 или 1.2.33.11 и т. Д.

  • Вторая проблема в вашей части регулярного выражения - это \.(?<type>\w*), гдеэто будет соответствовать буквальной точке, а затем нулю или более символу слова, который будет даже совпадать с последней цифрой в случае, если на самом деле нет данных версии, из-за которых он будет соответствовать 221 в строке 2.13.1801.221, что не то, что вы хотите.Фактически, поскольку ваша версия может отсутствовать в строке, вам нужно использовать оператор ?, чтобы указать всю группу как необязательную, и использовать [a-zA-Z] для сбора данных версии, и ваша исправленная часть регулярного выражения должна быть этой (?:\.(?<type>[a-zA-Z]+))?.Если данные вашей версии могут содержать числа, вы можете увеличить свою секунду, изменив значение [a-zA-Z]+ на [a-zA-Z][a-zA-Z\d]*, где это означает, что строка версии должна начинаться с алфавита, а цифры могут присутствовать позже.

  • Кроме того, я создал несколько групп в вашем регулярном выражении как группы без захвата, поместив ?: непосредственно перед (, так как вам не нужно захватывать их отдельно.
...