JavascriptRegex使用字典中的多个单词从第一人称转换为第二人称

我正在编写一个 Javascript 函数来将句子从第一人称转换为第二人称。我目前的测试功能如下:

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"
    };

    var pattern = `b(?:${Object.keys(transforms).join('|')})b`;
    var re = new RegExp(pattern, "g");

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

这将创建以下正则表达式模式:

/b(?:I|ME|MY|AM|MINE|I'M)b/g

产生以下输出:

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

我对 Javascript 非常陌生,因此,这很可能是一种糟糕的方法,当然这也让我将这个词YOU'M作为输出的一部分。

但是,理想情况下,我想要一个可以:

  • 允许我将新条目添加到字典中,它们将被添加到替换中(就像这里的${Object.keys(transforms).join('|')}部分所做的那样)
  • 显然,能够处理诸如I'M.

这样做的好方法是什么,以防万一有人知道一种完全不同的方式,我可以更轻松/正确地轻松地从第一人称更改为第二人称,我也很喜欢这个答案!

谢谢!

回答

单词边界不会给出正确的结果,因为您有非单词字符,例如'inI'M和 sinceI放置在I'Min 交替之前bIb满足匹配 inI'm并使其成为YOU'm

为了解决这个问题,您可以在正则表达式中使用此解决方案,方法略有不同,即

(?<!w)(?:I|ME|MY|AM|MINE|I'M)(?![w'])
(?<!w)(?:I|ME|MY|AM|MINE|I'M)(?![w'])

正则表达式演示

  • (?<!w): Negative Lookbehind 以确保我们在匹配之前没有单词字符
  • (?![w']): Negative Lookahead 以确保我们没有单词字符或'匹配之后

代码:

  • 我最终选择了另一个答案,因为不幸的是,如果句子中有类似“我,当前的叙述者,去看电影”这样的内容,你的解决方案就会失效。——这是一种非常可能的情况。我真的很喜欢你的回答,不过,只是不适合这种特殊情况。谢谢!

以上是JavascriptRegex使用字典中的多个单词从第一人称转换为第二人称的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>