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;
|
||||
}
|
||||
|
||||
// <summary>
|
||||
// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
|
||||
// </summary>
|
||||
public static bool ExprMatch(this string instance, string expr, bool caseSensitive)
|
||||
/// <summary>
|
||||
/// Do a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
|
||||
/// </summary>
|
||||
private static bool ExprMatch(this string instance, string expr, bool caseSensitive)
|
||||
{
|
||||
if (expr.Length == 0 || instance.Length == 0)
|
||||
return false;
|
||||
// case '\0':
|
||||
if (expr.Length == 0)
|
||||
return instance.Length == 0;
|
||||
|
||||
switch (expr[0])
|
||||
{
|
||||
case '\0':
|
||||
return instance[0] == 0;
|
||||
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 '?':
|
||||
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:
|
||||
return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) &&
|
||||
ExprMatch(expr + 1, instance + 1, caseSensitive);
|
||||
if (instance.Length == 0) return false;
|
||||
return (caseSensitive ? instance[0] == expr[0] : char.ToUpper(instance[0]) == char.ToUpper(expr[0])) && ExprMatch(instance.Substring(1), expr.Substring(1), caseSensitive);
|
||||
}
|
||||
}
|
||||
|
||||
// <summary>
|
||||
// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||
// </summary>
|
||||
/// <summary>
|
||||
/// Do a simple case sensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
|
||||
// <summary>
|
||||
// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||
// </summary>
|
||||
/// <summary>
|
||||
/// Do a simple case insensitive expression match, using ? and * wildcards (see [method expr_match]).
|
||||
/// </summary>
|
||||
public static bool MatchN(this string instance, string expr)
|
||||
{
|
||||
if (instance.Length == 0 || expr.Length == 0)
|
||||
return false;
|
||||
|
||||
return instance.ExprMatch(expr, caseSensitive: false);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue