scala regex用于匹配字符串中的制表符分隔的单词

时间:2016-10-10 15:36:01

标签: regex scala match

我试图匹配以下字符串

"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

然而,当我尝试使用只有名称和类型的字符串而没有评论时,这是有效的,这是一组可能或不存在的单词。

1 个答案:

答案 0 :(得分:0)

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

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

要使代码正常工作,您需要定义3个捕获组。此外,不清楚分隔符是什么,让我假设前两个字段只是由1个或多个空格分隔的1个或多个字母数字/下划线符号。评论是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

请注意,我们需要编译一个正则表达式对象,请注意正则表达式.r之后的nameType

请注意,match内的模式默认为锚定,字符串锚^的开头可以省略。

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