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