diff --git a/extensions/msteams/src/mentions.test.ts b/extensions/msteams/src/mentions.test.ts index bfd66873ed..13d9e02e74 100644 --- a/extensions/msteams/src/mentions.test.ts +++ b/extensions/msteams/src/mentions.test.ts @@ -208,4 +208,16 @@ describe("formatMentionText", () => { expect(result).toBe("Hello world"); }); + + it("escapes regex metacharacters in names", () => { + const text = "Hey @John(Test) and @Alice.Smith"; + const mentions = [ + { id: "28:xxx", name: "John(Test)" }, + { id: "28:yyy", name: "Alice.Smith" }, + ]; + + const result = formatMentionText(text, mentions); + + expect(result).toBe("Hey John(Test) and Alice.Smith"); + }); }); diff --git a/extensions/msteams/src/mentions.ts b/extensions/msteams/src/mentions.ts index 7ff3a3578e..fc63093b00 100644 --- a/extensions/msteams/src/mentions.ts +++ b/extensions/msteams/src/mentions.ts @@ -106,7 +106,8 @@ export function formatMentionText(text: string, mentions: MentionInfo[]): string let formatted = text; for (const mention of mentions) { // Replace @Name or @name with Name - const namePattern = new RegExp(`@${mention.name}`, "gi"); + const escapedName = mention.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const namePattern = new RegExp(`@${escapedName}`, "gi"); formatted = formatted.replace(namePattern, `${mention.name}`); } return formatted;