簡體   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