Merge pull request #42120 from raulsntos/fix-expr-match
Fix C# Match stackoverflow
This commit is contained in:
commit
fdfcce1c03
|
@ -624,41 +624,46 @@ namespace Godot
|
||||||
return instance.Length;
|
return instance.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <summary>
|
/// <summary>
|
||||||
// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
|
/// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
|
||||||
// </summary>
|
/// </summary>
|
||||||
public static bool ExprMatch(this string instance, string expr, bool caseSensitive)
|
private static bool ExprMatch(this string instance, string expr, bool caseSensitive)
|
||||||
{
|
{
|
||||||
if (expr.Length == 0 || instance.Length == 0)
|
// case '\0':
|
||||||
return false;
|
if (expr.Length == 0)
|
||||||
|
return instance.Length == 0;
|
||||||
|
|
||||||
switch (expr[0])
|
switch (expr[0])
|
||||||
{
|
{
|
||||||
case '\0':
|
|
||||||
return instance[0] == 0;
|
|
||||||
case '*':
|
case '*':
|
||||||
return ExprMatch(expr + 1, instance, caseSensitive) || instance[0] != 0 && ExprMatch(expr, instance + 1, caseSensitive);
|
return ExprMatch(instance, expr.Substring(1), caseSensitive) || (instance.Length > 0 && ExprMatch(instance.Substring(1), expr, caseSensitive));
|
||||||
case '?':
|
case '?':
|
||||||
return instance[0] != 0 && instance[0] != '.' && ExprMatch(expr + 1, instance + 1, caseSensitive);
|
return instance.Length > 0 && instance[0] != '.' && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
|
||||||
default:
|
default:
|
||||||
return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) &&
|
if (instance.Length == 0) return false;
|
||||||
ExprMatch(expr + 1, instance + 1, caseSensitive);
|
return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// <summary>
|
/// <summary>
|
||||||
// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
|
/// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||||
// </summary>
|
/// </summary>
|
||||||
public static bool Match(this string instance, string expr, bool caseSensitive = true)
|
public static bool Match(this string instance, string expr, bool caseSensitive = true)
|
||||||
{
|
{
|
||||||
|
if (instance.Length == 0 || expr.Length == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
return instance.ExprMatch(expr, caseSensitive);
|
return instance.ExprMatch(expr, caseSensitive);
|
||||||
}
|
}
|
||||||
|
|
||||||
// <summary>
|
/// <summary>
|
||||||
// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
|
/// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||||
// </summary>
|
/// </summary>
|
||||||
public static bool MatchN(this string instance, string expr)
|
public static bool MatchN(this string instance, string expr)
|
||||||
{
|
{
|
||||||
|
if (instance.Length == 0 || expr.Length == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
return instance.ExprMatch(expr, caseSensitive: false);
|
return instance.ExprMatch(expr, caseSensitive: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue