Необязательная группировка в регулярных выражениях Scala - PullRequest
2 голосов
/ 21 ноября 2011

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

val regex(name, ver) = "file.jar"          // name = file, ver = empty
val regex(name, ver) = "some-software.jar" // name = some-software, ver = empty
val regex(name, ver) = "software-1.0.jar"  // name = software, ver = 1.0
val regex(name, ver) = "some-file-1.0.jar" // name = some-file, ver = 1.0

Как такое регулярное выражение написано на Scala / Java? В Perl я бы сделал что-то вроде:

(*). (- (\ d |.) *) ?. баночка

но Scala не поддерживает создание дополнительных групп в этом синтаксисе.

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Я не уверен, что ваш вопрос сейчас.

Я предполагаю, что он не соответствует второй группе, потому что первая является жадной, а поскольку вторая является необязательной, первая соответствует всему.

Попробуй это:

(.*?)(?:-(?=\d)(.*))?.jar

Посмотри здесь на Regexr

  1. Я сделал первую группу ленивым совпадением с .*?
  2. Вторая группа - группа без захвата (группа, начинающаяся с (?:. Теперь вы найдете имя в группе 1 и версию в группе 2.
  3. Я поставил заглядывание после черты, так что он ищет тире, за которым следует цифра.
1 голос
/ 21 ноября 2011

Как насчет:

/^(.+?)(?:-([\d.]*))?\.jar$/

Предполагается, что версия всегда состоит из цифр и точек.

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