You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将普通字符串转义为正则表达式,实现与String.contains一致的匹配?

嘿,这个需求太实用了!刚好我之前也遇到过类似的场景——需要把带特殊字符的普通字符串转成正则,避免那些括号、问号之类的符号被当成正则语法解析。

其实Scala里可以直接借助Java正则库的工具类来搞定,就是java.util.regex.Pattern.quote()方法。它会自动把你的普通字符串转成正则的字面量形式,所有特殊字符都会被转义,完全实现和String.contains()一致的精确匹配效果。

举个例子,针对你提到的待匹配字符串Do I (really) want to match? Yes, I do.,用这个方法处理后,括号和问号都会被当作普通字符,不会触发正则的分组或匹配逻辑。

把你原来的统计函数改造一下就是这样:

import java.util.regex.Pattern

def countSubstring(str: String, substr: String): Int = {
  // 转义子串,确保所有正则特殊字符被当作字面量处理
  val escapedSubstr = Pattern.quote(substr)
  escapedSubstr.r.findAllMatchIn(str).length
}

原理很简单:Pattern.quote()会把输入字符串包裹在\Q和\E这对正则标记里,在这个范围内的所有字符都会被视为普通文本,完全忽略它们的正则特殊含义。这样不管你的子串里有多少括号、问号、星号这类符号,都能精准匹配,和contains的逻辑完全对齐。

而且这个方法不止适用于统计子串次数,任何需要用正则处理普通字符串的场景都能用——比如查找位置、替换内容等等,只要先转义再生成正则实例就好。

内容的提问来源于stack exchange,提问作者Suma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:42:56