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 以确保我们没有单词字符或'匹配之后
代码:
- 我最终选择了另一个答案,因为不幸的是,如果句子中有类似“我,当前的叙述者,去看电影”这样的内容,你的解决方案就会失效。——这是一种非常可能的情况。我真的很喜欢你的回答,不过,只是不适合这种特殊情况。谢谢!
THE END
二维码