在Scala中将regex可选组设置为“无”

在Scala中将regex可选组设置为“无”,regex,scala,Regex,Scala,我有以下正则表达式模式,该模式匹配完全限定的Microsoft SQL Server表名([dbName].[schemaName].[tableName]),其中模式名是可选的: val tableNamePattern = """\[(\w+)\](?:\.\[(\w+)\])?\.\[(\w+)\]""".r 我是这样使用它的: val tableNamePattern(database, schema, tableName) = fullyQualifiedTableName 缺少架

我有以下正则表达式模式,该模式匹配完全限定的Microsoft SQL Server表名(
[dbName].[schemaName].[tableName]
),其中模式名是可选的:

val tableNamePattern = """\[(\w+)\](?:\.\[(\w+)\])?\.\[(\w+)\]""".r
我是这样使用它的:

val tableNamePattern(database, schema, tableName) = fullyQualifiedTableName
缺少架构名称时(例如:
[dbName].[tableName]
),将
架构
值设置为
null

是否有一种Scala惯用的方法将其设置为
None
,并在提供schemaName时设置为
Some(schema)

有些人在遇到问题时会想 “我知道,我会使用正则表达式。”现在他们有两个问题。 --杰米·扎温斯基


我将从链接问题的已接受答案中复制代码,但也不提供学分。这是:

object Optional {
  def unapply[T](a: T) = if (null == a) Some(None) else Some(Some(a))
}

val tableNamePattern(database, Optional(schema), tablename) = fullyQualifiedTableName

PS:我今天在twitter上想知道创建特例提取器是否像他们建议的那样普遍

相关:让我想到一个(伪代码如下)
extractor[T]可选(a:T)=if(null==a)Some(None)Some(None)other Some(Some(a))
某种类型的宏:PIs这个策略有什么用词吗?“双重浸泡”并不能完全涵盖这一点。该表达式是否相当于某些(选项(a))?只问,因为对于剪切/粘贴很多的代码来说,DRY更为重要。当然注意到它在2.7.x中仍然不起作用。@som snytt我认为它是等效的,是的。