diff --git a/src/Discord.Net/Format.cs b/src/Discord.Net/Format.cs
index cdee8e473..724f05ba7 100644
--- a/src/Discord.Net/Format.cs
+++ b/src/Discord.Net/Format.cs
@@ -1,34 +1,24 @@
using System.Text;
+using System.Text.RegularExpressions;
namespace Discord
{
public static class Format
{
- private static char[] specialChars = new char[] { '_', '*', '~', '\\' }; //Backslash must always be last!
+ private static readonly Regex _escapeRegex;
+ private static readonly MatchEvaluator _escapeEvaluator;
- /// Removes all special formatting characters from the provided text.
- private static string Escape(string text)
+ static Format()
{
- if (text.IndexOfAny(specialChars) >= 0)
- {
- StringBuilder builder = new StringBuilder(text);
- foreach (char c in specialChars)
- {
- int length = builder.Length;
- for (int i = 0; i < length; i++)
- {
- if (builder[i] == c)
- {
- builder.Insert(i, '\\');
- length++;
- }
- }
- }
- return builder.ToString();
- }
- return text;
+ const string innerPattern = "[_*]|~~";
+ _escapeRegex = new Regex($@"(?:^|\W)(?:{innerPattern})|(?:{innerPattern})(?:\W|$)|\\", RegexOptions.Compiled);
+ _escapeEvaluator = new MatchEvaluator(e => '\\' + e.Value);
}
+ /// Removes all special formatting characters from the provided text.
+ private static string Escape(string text)
+ => _escapeRegex.Replace(text, _escapeEvaluator);
+
/// Returns a markdown-formatted string with no formatting, optionally escaping the contents.
public static string Normal(string text, bool escape = true)
=> escape ? Escape(text) : text;