在Scala中进行模式匹配期间排除String的一部分

时间:2013-10-11 07:44:44

标签: regex string scala

我有一个简单的问题。在我的单元测试中,我将预期输出与实际输出比较为String值。现在,字符串的一部分是随机生成的唯一ID,导致测试每次都失败。有没有办法可以指定我的测试只匹配字符串中两点之间的部分实际和忽略文本。像 -

这样的函数
def isMatch(expected : String, actual : String , ignoreFrom : String , ignoreTo : String)

另外,由于这是模式匹配的候选者,有人可以指出模式匹配/正则表达式用于Dummies类教程吗?

2 个答案:

答案 0 :(得分:2)

我认为Scala extractors就是你想要的。您可以指定extractor以仅匹配字符串的特定部分。

以下是一些例子:

object IgnoreBetween {
    def unapply(str: String): Option[(String, String)] = {
        val parts = str split "\\."
        if (parts.length == 3){
            Some(parts(0), parts(2))
        }else{
            None
        }
    }
}

object Main extends App {
    "part1.somerandom.part2" match {
        case IgnoreBetween("part1", "part2") => println("matches")
        case _ => println("doesn't match")
    }
}

“Scala编程”和“Scala in depth”在模式匹配方面有着惊人的例子。

答案 1 :(得分:0)

我们创建了自定义匹配器来处理变量字符串,基本上使用正则表达式来表示测试的预期结果。有用的情况很多:像你的情况一样的变量ID,不同的服务器URL就像我们在QA行,日期,...中运行测试一样......

你想要的是一些通用模式匹配器,例如:

def matches(expected : String, actual : String) = {
    val pattern = expected.r.pattern
    pattern.matcher(actual).matches
}

示例用法(在REPL上):

scala> matches("user id='(.+)' retrieved", "user id='12345' retrieved")
res1: Boolean = true

scala> matches("user id='(.+)' retrieved", "user id='12345' not found")
res2: Boolean = false