簡體   English   中英

比較 C# 中視覺上相似的字符串

[英]Comparing visually similar strings in C#

如果這是一個明顯的問題,這里的新程序員非常抱歉。 我需要在 C# 中編寫一段非常簡單的代碼(作為練習,所以沒有要連接的數據庫)來比較兩個視覺上相似的字符串,例如 FOX 和 F0X。

據我所知,大多數比較方法都會說它們不相似,因為 O 和 0 是不同的字符,所以我對如何 go 感到有點茫然!

任何指針將不勝感激! 謝謝

這不是一項簡單的任務,並且沒有單一的預定義方法可以做到這一點。

但是考慮到你可能會如何處理它,你可能需要首先建立一個關於你認為哪些角色看起來相似的規則集合。 然后在比較字符時查找這些規則。

像這樣的東西。

string[] SimilarCharacters = new string[]
{
    "O0",
    "I1"
    // Etc...
};

void Main()
{
    Console.WriteLine(AreSimilar("FOX", "F0X"));
    Console.WriteLine(AreSimilar("BOX", "B0X"));
    Console.WriteLine(AreSimilar("FIG", "F1G"));
    Console.WriteLine(AreSimilar("J1G", "JIG"));
}

bool AreSimilar(string s1, string s2)
{
    // No match if different lengths
    if (s1.Length != s2.Length)
        return false;

    for (int i = 0; i < s1.Length; i++)
    {
        if (s1[i] != s2[i])
        {
            string similar = FindSimilar(s1[i]);
            if (similar == null)
                return false;
                
            if (!similar.Contains(s2[i]))
                return false;
        }
    }
    return true;
}

string FindSimilar(char c)
{
    for (int i = 0; i < SimilarCharacters.Length; i++)
    {
        if (SimilarCharacters[i].Contains(c))
            return SimilarCharacters[i];
    }
    return null;
}

我認為適當的方法是用其中一個替換所有相似的字符(或字符集)。 即:用“O”替換所有“O”和“0”(反之亦然)。 這樣,你就只有一個角色需要關注。 請注意,您必須考慮大寫和小寫,因為我假設您不希望將“o”替換為“O”(或者您可能會這樣做。)無論哪種方式,我認為這是一個好方法。

        using System.Text;
        
        (...)

        string a = "0()P is e><ce1|ent"; //OOP, Object Oriented Programming
        StringBuilder b = new StringBuilder();

        bool parenthesesZero = false;
        bool greaterThanX = false;

        for (int i = 0; i < a.Length; i++)
        {
            switch (a[i])
            {
                case '0':
                    b.Append('O');
                    break;
                case '(':
                    b.Append('(');
                    parenthesesZero = true;
                    break;
                case ')':
                    if (parenthesesZero)
                    {
                        b[i - 1] = 'O';
                        parenthesesZero = false;
                    }
                    else
                        b.Append(')');
                    break;
                case '>':
                    b.Append('>');
                    greaterThanX = true;
                    break;
                case '<':
                    if (greaterThanX)
                    {
                        b[b.Length - 1] = 'X';
                        greaterThanX = false;
                    }
                    else
                        b.Append('<');
                    break;
                case '|':
                case 'I':
                case '1':
                    b.Append('l');
                    break;
                default:
                    b.Append(a[i]);
                    break;
            }
        }
            

        Console.WriteLine(a + "\n" + b);

請注意我如何使用 fallthrough 將一組相似字符集中到一個中,以及我如何跟蹤可能被一個(或多個)字符替換的多個字符序列。 如果您有兩個以上的字符,則可以考慮使用 integer 計數器。

這可能不是最好的答案,但我希望你認為它有用。

再會!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM