繁体   English   中英

比较两个带通配符的字符串

[英]Compare Two Strings With Wildcards

我需要比较两个字符串,其中一个使用'*'作为通配符。 当我意识到RegEx可以更快地执行任务时,我正在考虑使用迭代或递归方法。 不幸的是,我是RegEx的新手,并且不确定如何执行此操作。

如果我发送的格式为“ He ** o”,则“ Hello”和“ He7(o)”应返回true,但“ Hhllo”应返回false。

假设您将*表示为单字符通配符,则Regex模式中的正确替换为点( . ):

string pattern = "He**o";
string regexPattern = pattern.Replace("*",".");

Regex.IsMatch("Hello",regexPattern); // true
Regex.IsMatch("He7)o",regexPattern); // true
Regex.IsMatch("he7)o",regexPattern); // false
Regex.IsMatch("he7)o",regexPattern, RegexOptions.IgnoreCase); // true

您可能还想用^ (字符串的开头)和$ (字符串的结尾)锚定模式:

regexPattern = String.Format("^{0}$", pattern.Replace("*","."));

如果您希望它能够解析带有特殊字符的输入字符串,则可以像这样对所有其他字符进行转义:

string regexPattern = String.Join(".",pattern.Split("*".ToCharArray())
                                             .Select(s => Regex.Escape(s)).ToArray());

通过在for循环中使用char索引比较字符串。 如果出现模式字符(通配符),请忽略比较并继续进行下一个比较。

private bool Compare(string pattern, string compare)
{
    if (pattern.Length != compare.Length)
        //strings don't match
        return false;

    for(int x = 0, x < pattern.Length, x++)
    {
        if (pattern[x] != '*')
        {
            if (pattern[x] != compare[x])
                return false;
        }
    }
    return true;
}

使用“ He..lo”制作正则表达式

这是一种无法识别的情况

Regex r = new Regex("He..o");
string test = "Hhleo";
bool sucess = r.Match(a).Success;

这种情况将被认可

Regex r = new Regex("He..o");
string test = "He7)o";
bool sucess = r.Match(a).Success;

这正是我今天在php所做的。 当您添加此:

if (pattern[x] != '*' && compare[x] != '*')

然后,两个字符串都可以具有通配符。 (希望&&php表示逻辑AND)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM