2015-09-21 69 views
0

下面是使用命名组一些Scala的匹配代码:Scala 2.11(/ java8)matcher不允许命名捕获组?

val regex=".*Completed (?<tstamp>[\d]{4}-[\d]{6})/(?<tname>[\w]+) (?<loops>[\d]+)Loops (?<cores>[\d]+)cores (?<mem>[\d]+)mb (?<inrecs>[\d]+)recs (?<nparts>[\d]+)parts (?<xform>[\w]+) (?<action>[\w]+) - duration=(?<duration>[\d]+\.[\d]+) seconds count=(?<outrecs>[\d]+).*" 
    val rmatch = meta.regex.findFirstMatchIn(line) 

输入是:

<03:54:26> Completed 0917-035231/CpuMem 100000000Loops 16cores 128mb 5000000recs 20parts GroupByKey Count - duration=41.408 seconds count=5000000 

我们可以在监视屏幕截图为模式(第三项)看到第一捕获组名为tstamp。它得到恰当捕获和查看

m[atch].group(1) 

然而,它是命名组

m[atch].group("tstamp") 

enter image description here

有关于这一主题的另一个SOF问题接触中访问但为五(Java7推出之前支持命名组):Scala regex Named Capturing Groups

但是那个不能解决scala的这种情况2.11/java8

回答

1

Scala 2.12需要Java 8并且可以改进API。

同时,样品延伸:

https://github.com/som-snytt/regextractor/blob/master/core/src/test/scala/regex/GrTest.scala#L85

在另一静脉,https://github.com/travisbrown/expressier

+0

THX为缺乏在组原生阶支撑的确认。要使用上述任何一种方式,需要将类(和宏)文件复制到我自己的项目中? (当然,他们没有maven repo ..) – javadba

+0

sbt让你依赖github源代码项目,所以人们懒得发布例子项目。 –

+0

哦,这很有趣。我想知道maven是否有类似的能力。我添加了一个答案,作为扩展的评论来展示如何使用maven。 – javadba

1

这是更从SOM-snytt接受的答案的扩展的评论。他提到的扩展可能被直接作为依赖包含在sbt中。 Maven的需要多一点的工作:通过包括以下的jitpack混帐到Maven的工具:

Try jitpack, you just need to add the dependency, jitpack will build others for you. 

Can I use a GitHub project directly in Maven?

From home page: 

jitpack 
Easy to use package repository for Gradle and Maven projects 
JitPack builds GitHub projects on demand and provides ready-to-use packages 
HOW 

Add repository first 
<repository> 
    <id>jitpack.io</id> 
    <url>https://jitpack.io</url> 
</repository> 
Add dependency 
<dependency> 
    <groupId>com.github.User</groupId> 
    <artifactId>Repo name</artifactId> 
    <version>Release tag</version> 
</dependency>