I am writing a Javascript function to convert a sentence from first person to second person. My current test function is as follows:
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);
}
This creates the following regex pattern:
/\b(?:I|ME|MY|AM|MINE|I'M)\b/g
Which produces the following output:
YOU WENT TO THE MOVIES WITH YOUR FRIEND, SALLY. SALLY SAYS THAT YOU'M HER BEST FRIEND.
I'm very new to Javascript and, so, this is most probably a terrible way to do this and, of course this leaves me with the word YOU'M as part of my output as well.
But, ideally, I'd like a solution that could:
${Object.keys(transforms).join('|')} portion)I'M.What would be a good way to do this and, just in case anyone knows of a completely different way I could easily change from first to second person more easily / correctly, I'd LOVE that answer as well!!
Thanks!
Word boundaries won't give correct result because you have non-word characters like ' in I'M and since I is placed before the I'M in alternations \bI\b satisfies the match in I'm and makes it YOU'm.
To address this, you may use this solution with slightly different approach in regex i.e.
(?<!\w)(?:I|ME|MY|AM|MINE|I'M)(?![\w'])
RegEx Demo
(?<!\w): Negative Lookbehind to make sure we don't have a word character before the match(?![\w']): Negative Lookahead to make sure we don't have a word character or ' after the matchCode:
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With