Scala SQL中如何转义反斜杠与双引号为正则适配contains匹配
问题根因
org.apache.spark.sql.Column.contains()是字面量子串匹配方法,不接收正则表达式,只需要按照编程语言的字符串转义规则传入要匹配的真实子串即可,不需要额外做正则转义。- 你之前写法失效的核心原因是转义错误:
- 写
"\"\""时,只对双引号做了转义,没有转义反斜杠,实际传入的匹配内容是两个连续双引号"",完全不包含反斜杠,自然匹配不到目标行。 - 用单引号包裹内容的写法不符合Scala语法:Scala中单引号用于定义单个Char字符,无法传入多字符的字符串,逻辑本身就不成立。
- 写
正确实现方案
优先推荐用Scala三引号原生字符串写法,完全不需要手动处理转义,不会写错:
// 三引号内所有字符按字面量解析,直接写要匹配的\"\"即可 filter(!$"KEY".contains("""\"\""""))
如果要使用普通双引号包裹字符串,严格按照转义规则书写即可:Scala中字面量反斜杠需要用\\表示,字面量双引号在双引号包裹的字符串中需要用\"表示,目标子串\"\"对应的转义后写法如下:
// 转义后实际传入的匹配子串为 \"\" filter(!$"KEY".contains("\\\"\\\""))
转义正确性校验
可以在本地执行简单代码验证字符串内容是否符合预期:
// 三引号写法校验 val matchStr1 = """\"\"""" println(matchStr1) // 控制台输出: \"\" // 普通双引号转义写法校验 val matchStr2 = "\\\"\\\"" println(matchStr2) // 控制台输出: \"\"
两种写法输出的匹配串完全一致,都可以正确过滤掉包含\"\"子串的行。
内容的提问来源于stack exchange,提问作者Divakar R
相关产品推荐
相关产品推荐

