Scala正则表达式中的可选分组

时间:2011-11-21 15:02:50

标签: regex scala

说我想制作一个正则表达式,从文件名中分割出一个可选的版本号,即

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 个答案:

答案 0 :(得分:3)

我不确定你现在的问题是什么。

我认为它与第二组不匹配,因为第一组是贪婪的,因为第二组是可选的,所以第一组匹配所有内容。

试试这个:

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

here on Regexr

  1. 我让第一组与.*?
  2. 进行了懒惰匹配
  3. 第二组是非捕获组(以(?:开头的组。您将在组1中找到该名称,在组2中找到该名称。
  4. 我在破折号后面进行了预测,以便搜索破折号后跟数字。

答案 1 :(得分:1)

怎么样:

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

假设版本总是混合数字和点。