regex - 无法匹配正则表达式中的字符串文字

标签 regex scala pattern-matching

我正在尝试将字符串文字与内部转义字符串的可能性进行匹配

到目前为止,我得到的结果看起来有点像这样:

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"

参见another IDEONE demo

展开版本的工作速度要快得多,因为它以线性方式匹配字符串文字,而不会因正则表达式中的交替而导致过多的回溯。

关于regex - 无法匹配正则表达式中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269171/

相关文章:

scala - 定义依赖于隐式的抽象类或特征

reference - 为什么在使用 Option::map 时会出现借用错误,而在手动匹配时却不会?

javascript - 包含 15 位字母数字和逗号分隔符的正则表达式

regex - 中间带有可变字符的负向后视正则表达式 (PERL)

regex - Sed 正则表达式多行 - 替换 HTML

scala - 密封特性中的方法在类文件中给出重复的字段名称和签名

java - 正则表达式问题

java - Scala Spark - java.lang.UnsupportedOperationException : empty. init

haskell - 使用 if-then-else 的非详尽模式

javascript - 正则表达式:仅允许使用数字或包含 '-' 和 '_' 的字母数字,但不允许包含包含 '-' 和 '-' 的数字