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

如何用JavaScript正则实现第一人称到第二人称的正确转换?

问题根因

你遇到的YOU'M错误由三个核心原因导致:

  • 正则匹配顺序错误:当前转换字典的键遍历顺序是短词I在前、长词I'M在后,正则会优先匹配先出现的短规则,导致I'M中的I先被替换为YOU,剩余的'M无匹配规则,最终生成错误内容。
  • 模板字符串转义错误:你写的\b在模板字符串中会被解析为退格转义符,实际传入RegExp构造函数的并不是单词边界标识,需要写成\\b才能生效。
  • 特殊字符未做转义处理:如果转换字典的键包含.、?这类正则特殊字符时,会直接破坏正则结构,需要提前转义。

实现方案

修正后的代码完全满足你的需求,新增转换条目无需修改其他逻辑,可自动适配带缩写符号的匹配:

// 正则特殊字符转义工具函数
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

function statementCreator() {
  var sentence = "I went to the movies with my friend, Sally. Sally says that I'm her best friend.";

  var transforms = {
    "I" : "YOU", 
    "ME" : "YOU", 
    "MY" : "YOUR", 
    "AM" : "ARE", 
    "MINE" : "YOURS",
    "I'M" : "YOU'RE"
    // 后续新增条目直接在这里添加即可,自动适配规则
  };

  // 核心:将转换键按长度降序排序,长词优先匹配,避免短词截断长词
  const sortedKeys = Object.keys(transforms).sort((a, b) => b.length - a.length);
  // 转义每个键的正则特殊字符后拼接规则
  const pattern = `\\b(?:${sortedKeys.map(escapeRegExp).join('|')})\\b`;
  const re = new RegExp(pattern, "g");

  const str = sentence.toUpperCase().replace(re, matched => transforms[matched]);
  console.log(str);
}

输出结果

执行上述代码后输出内容如下,完全符合预期:

YOU WENT TO THE MOVIES WITH YOUR FRIEND, SALLY. SALLY SAYS THAT YOU'RE HER BEST FRIEND.

拓展优化思路

如果需要保留原句的大小写,不需要统一转大写,可以修改正则匹配模式为gi,同时将转换逻辑调整为兼容大小写的匹配映射即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:27:03