Browse Source

Fix #2481: Remove 4 characters length requirement in regex search.

pull/2489/head
Siegfried Pammer 4 years ago
parent
commit
dd1621a811
  1. 36
      ILSpy/Search/AbstractSearchStrategy.cs

36
ILSpy/Search/AbstractSearchStrategy.cs

@ -25,14 +25,10 @@ namespace ICSharpCode.ILSpy.Search
if (terms.Length == 1 && terms[0].Length > 2) if (terms.Length == 1 && terms[0].Length > 2)
{ {
string search = terms[0]; string search = terms[0];
if (search.StartsWith("/", StringComparison.Ordinal) && search.Length > 4) if (TryParseRegex(search, out regex))
{ {
var regexString = search.Substring(1, search.Length - 1);
fullNameSearch = search.Contains("\\."); fullNameSearch = search.Contains("\\.");
omitGenerics = !search.Contains("<"); omitGenerics = !search.Contains("<");
if (regexString.EndsWith("/", StringComparison.Ordinal))
regexString = regexString.Substring(0, regexString.Length - 1);
regex = SafeNewRegex(regexString);
} }
else else
{ {
@ -129,15 +125,35 @@ namespace ICSharpCode.ILSpy.Search
resultQueue.TryAdd(result); resultQueue.TryAdd(result);
} }
Regex SafeNewRegex(string unsafePattern) bool TryParseRegex(string input, out Regex pattern)
{ {
try pattern = null;
if (!input.StartsWith("/", StringComparison.Ordinal))
{ {
return new Regex(unsafePattern, RegexOptions.Compiled); return false;
}
input = input.Substring(1);
if (input.EndsWith("/", StringComparison.Ordinal))
{
input = input.Remove(input.Length - 1);
} }
catch (ArgumentException) if (string.IsNullOrWhiteSpace(input))
{ {
return null; return false;
}
pattern = SafeNewRegex(input);
return pattern != null;
static Regex SafeNewRegex(string unsafePattern)
{
try
{
return new Regex(unsafePattern, RegexOptions.Compiled);
}
catch (ArgumentException)
{
return null;
}
} }
} }
} }

Loading…
Cancel
Save