|
|
@@ -1,5 +1,6 @@ |
|
|
|
using Discord.Interactions; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
|
|
|
|
namespace System.Text.RegularExpressions |
|
|
@@ -90,7 +91,7 @@ namespace System.Text.RegularExpressions |
|
|
|
return match.Count; |
|
|
|
} |
|
|
|
|
|
|
|
internal static bool TryBuildRegexPattern<T>(T commandInfo, string wildCardStr, out string pattern) where T: class, ICommandInfo |
|
|
|
internal static bool TryBuildRegexPattern<T>(T commandInfo, string wildCardStr, out string pattern) where T : class, ICommandInfo |
|
|
|
{ |
|
|
|
if (commandInfo.TreatNameAsRegex) |
|
|
|
{ |
|
|
@@ -105,14 +106,72 @@ namespace System.Text.RegularExpressions |
|
|
|
} |
|
|
|
|
|
|
|
var escapedWildCard = Regex.Escape(wildCardStr); |
|
|
|
var unquantified = Regex.Replace(commandInfo.Name, $@"(?<!\\){escapedWildCard}(?<delimiter>[^{escapedWildCard}]?)", |
|
|
|
@"([^\n\t${delimiter}]+)${delimiter}"); |
|
|
|
var unquantifiedPattern = $@"(?<!\\){escapedWildCard}(?<delimiter>[^{escapedWildCard}]?)"; |
|
|
|
var quantifiedPattern = $@"(?<!\\){{(?<start>[0-9]+)(?<end>,[0-9]*)?(?<!\\)}}(?<delimiter>[^{escapedWildCard}]?)"; |
|
|
|
|
|
|
|
var quantified = Regex.Replace(unquantified, $@"(?<!\\){{(?<start>[0-9]+)(?<end>,[0-9]*)?(?<!\\)}}(?<delimiter>[^{escapedWildCard}]?)", |
|
|
|
@"([^\n\t${delimiter}]{${start}${end}})${delimiter}"); |
|
|
|
string name = commandInfo.Name; |
|
|
|
|
|
|
|
var matchPairs = new SortedDictionary<int, MatchPair>(); |
|
|
|
|
|
|
|
foreach (Match match in Regex.Matches(name, unquantifiedPattern)) |
|
|
|
matchPairs.Add(match.Index, new(MatchType.Unquantified, match)); |
|
|
|
|
|
|
|
foreach (Match match in Regex.Matches(name, quantifiedPattern)) |
|
|
|
matchPairs.Add(match.Index, new(MatchType.Quantified, match)); |
|
|
|
|
|
|
|
var sb = new StringBuilder(); |
|
|
|
|
|
|
|
var previousMatch = 0; |
|
|
|
|
|
|
|
foreach (var matchPair in matchPairs) |
|
|
|
{ |
|
|
|
sb.Append(Regex.Escape(name.Substring(previousMatch, matchPair.Key - previousMatch))); |
|
|
|
Match match = matchPair.Value.Match; |
|
|
|
MatchType type = matchPair.Value.Type; |
|
|
|
|
|
|
|
previousMatch = matchPair.Key + match.Length; |
|
|
|
|
|
|
|
var delimiter = match.Groups["delimiter"].Value; |
|
|
|
|
|
|
|
switch (type) |
|
|
|
{ |
|
|
|
case MatchType.Unquantified: |
|
|
|
{ |
|
|
|
sb.Append(@$"([^\n\t{Regex.Escape(delimiter)}]+){Regex.Escape(delimiter)}"); |
|
|
|
} |
|
|
|
break; |
|
|
|
case MatchType.Quantified: |
|
|
|
{ |
|
|
|
var start = match.Groups["start"].Value; |
|
|
|
var end = match.Groups["end"].Value; |
|
|
|
|
|
|
|
sb.Append($@"([^\n\t{Regex.Escape(delimiter)}]{{{start}{end}}}){Regex.Escape(delimiter)}"); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
pattern = "\\A" + sb.ToString() + "\\Z"; |
|
|
|
|
|
|
|
pattern = "\\A" + quantified + "\\Z"; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private enum MatchType |
|
|
|
{ |
|
|
|
Quantified, |
|
|
|
Unquantified |
|
|
|
} |
|
|
|
|
|
|
|
private record MatchPair |
|
|
|
{ |
|
|
|
public MatchType Type { get; } |
|
|
|
public Match Match { get; } |
|
|
|
|
|
|
|
public MatchPair(MatchType type, Match match) |
|
|
|
{ |
|
|
|
Type = type; |
|
|
|
Match = match; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |