我正在编写一个 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
等条目. 什么是这样做的好方法,以防万一有人知道完全不同的方法,我可以更轻松/正确地从第一人称更改为第二人称,我会 爱 那个答案也是!!
谢谢!
最佳答案
单词边界不会给出正确的结果,因为您有像 '
这样的非单词字符在 I'M
并且因为 I
放在 I'M
之前交替 \bI\b
满足 I'm
中的匹配并使其成为 YOU'm
.
为了解决这个问题,您可以在正则表达式中使用稍微不同的方法来使用此解决方案,即
(?<!\w)(?:I|ME|MY|AM|MINE|I'M)(?![\w'])
RegEx Demo(?<!\w)
: Negative Lookbehind 以确保我们在匹配前没有单词字符 (?![\w'])
: Negative Lookahead 以确保我们没有单词字符或 '
赛后代码:
function statementCreator() {
var sentence = "I went to the movies with my friend, Sally. Sally says that I'm her best friend. I, the current narrator, went to the movies.";
var transforms = {
"I" : "YOU",
"ME" : "YOU",
"MY" : "YOUR",
"AM" : "ARE",
"MINE" : "YOURS",
"I'M" : "YOU'RE"
};
var pattern = `(?<!\\w)(?:${Object.keys(transforms).join('|')})(?![\\w'])`;
var re = new RegExp(pattern, "ig");
str = sentence.toUpperCase().replace(re, matched => transforms[matched]);
console.log(str);
}
statementCreator();
关于Javascript Regex 使用字典中的多个单词从第一人称转换为第二人称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68677212/