我正在尝试将字符串文字与内部转义字符串的可能性进行匹配
到目前为止,我得到的结果看起来有点像这样:
def matchStringLiteral(input: String) = {
val strLit = """(\"(\\.|[^"])*\")""".r
input match {
case strLit(s) => s"matched literal $s"
case _ => "didn't match anything"
}
}
除非我尝试像这样使用它:
val str = "\"welcome to \\\"GenericWebsiteName.com\\\"\""
println(matchStringLiteral(str))
尽管在 Regex101 上工作正常,但它打印“不匹配任何内容”
有人可以向我解释我做错了什么,更重要的是为什么吗?
最佳答案
问题是您在模式中定义了 2 个捕获组(("(\\.|[^"])*")
中的 2 个不转义括号),然后仅声明一个参数在 case strLit(s)
中 - Scala 需要 两个 参数来表示 2 个捕获的值。
因此,要么定义 2 个参数:
case strLit(s1, s2) => s"matched literal. Group 1: $s1\nGroup 2: $s2"
请参阅IDEONE demo
或者 - 最佳 - 使用 an unrolled version of your regex具有非捕获组和不具有任何捕获组:
val strLit = """"[^"\\]*(?:\\.[^"\\]*)*"""".r
...
case strLit() => s"matched literal $input"
展开版本的工作速度要快得多,因为它以线性方式匹配字符串文字,而不会因正则表达式中的交替而导致过多的回溯。
关于regex - 无法匹配正则表达式中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269171/