Scala的正则表达式匹配标签从字符串

问题描述:

分开的话,我试图匹配以下字符串Scala的正则表达式匹配标签从字符串

"name  type  this is a comment" 

名称和类型是肯定有。 评论可能存在也可能不存在。 我试图将这个存储到变量n,t和c中。

val nameTypeComment = """^(\w+\s+){2}(?:[\w+\s*)*\(\,\,]+)""" 
str match { case nameType(n, t, c) => print(n,t,c) } 

这是我有,但似乎并没有工作。任何帮助表示赞赏。

val nameType = """^(\w+)\s+([\w\)\(\,]+)""".r 

但是这作品时,我试图与仅名称和类型,并没有评论这是一组单词可能或不存在的字符串工作。

+0

你能修改你的问题以包含错误信息吗? – stefanobaghino

+0

尝试http://ideone.com/RwG7yl –

+0

正则表达式看起来过于复杂。如果他们真的是制表符分隔,只是''分裂''\ t' –

请注意,^(\w+\s+){2}(?:[\w+\s*)*\(\,\,]+)正则表达式只包含1个捕获组((\w+\s+)),而在match块中定义3。

^(\w+)\s+([\w\)\(\,]+)只包含2个捕获组:(\w+)([\w\)\(\,]+)

为了使您的代码正常工作,您需要定义3个捕获组。此外,还不清楚分隔符是什么,让我假设前两个字段只是一个或多个由一个或多个空格分隔的字母数字/下划线符号。评论是2个第一个字段之后的任何内容。

然后,使用

val s = "name  type  this comment a comment" 
val nameType = """(\w+)\s+(\w+)\s+(.*)""".r 
val res = s match { 
    case nameType(n, t, c) => print(n,t,c) 
    case _ => print("NONE") 
} 

online demo

请注意,我们需要编译一个regex对象,正则表达式模式nameType后在.r注意。

注意,内部match图案是锚固默认字符串锚^的开始可以省略。

此外,最好添加case _来定义未找到匹配项时的行为。

+0

这工作。谢谢。 你能解释一下([\ w \)\(\,] +)吗? – dreddy

+0

你的意思是你的模式'([\ w)(\,] +)'部分?它匹配字符类中定义的一个或多个字符:字符(字母/数字/下划线),'(',')'或','。 –