Regex scala正则表达式以匹配字符串中以制表符分隔的单词

Regex scala正则表达式以匹配字符串中以制表符分隔的单词,regex,scala,match,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 na

我正在尝试匹配以下字符串

"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
但是,当我试图只使用名称和类型的字符串,而不使用注释时,这种方法是有效的。

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

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

要使代码正常工作,需要定义3个捕获组。此外,还不清楚分隔符是什么,让我假设前两个字段只是由1个或多个空格分隔的1个或多个字母数字/下划线符号。注释位于前两个字段之后

然后,使用

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")
}

注意,我们需要编译一个regex对象,请注意regex模式
nameType
之后的
.r

请注意,默认情况下,
匹配
中的模式被锚定,字符串锚定的开头可以省略

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

请注意
^(\w+\s+{2}(?:[\w+\s*)*\(\,\,]+)
regex只包含1个捕获组(
(\w+\s+)
),而在
匹配
块中定义3个

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

要使代码正常工作,需要定义3个捕获组。此外,还不清楚分隔符是什么,让我假设前两个字段只是由1个或多个空格分隔的1个或多个字母数字/下划线符号。注释位于前两个字段之后

然后,使用

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")
}

注意,我们需要编译一个regex对象,请注意regex模式
nameType
之后的
.r

请注意,默认情况下,
匹配
中的模式被锚定,字符串锚定的开头可以省略


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

是否可以编辑您的问题以包含错误消息?为此,请尝试使用Regex。如果它们是真正的制表符分隔的,只需在
\t
上进行
split
即可。您可以编辑您的问题以包含错误消息吗?为此,请尝试使用Regex。如果它们确实是分开的,只需在
\t
上进行
拆分即可。非常感谢。你能解释一下([\w)(\,]+)是什么意思吗?你是说你的图案
([\w)(\,]+)
部分吗?它匹配字符类中定义的一个或多个字符:单词字符(字母/数字/下划线)、
,或
。这很有效。非常感谢。你能解释一下([\w)(\,]+)是什么意思吗?你是说你的图案
([\w)(\,]+)
部分吗?它匹配字符类中定义的一个或多个字符:字字符(字母/数字/下划线)、
,或