diff --git a/src/Discord.Net/Format.cs b/src/Discord.Net/Format.cs
index cdee8e47..724f05ba 100644
--- a/src/Discord.Net/Format.cs
+++ b/src/Discord.Net/Format.cs
@@ -1,33 +1,23 @@
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;
+
+ static Format()
+ {
+ 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)
- {
- 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;
- }
+ => _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)