【问题标题】:Matching 2 strings in C#在 C# 中匹配 2 个字符串
【发布时间】:2017-07-01 19:27:54
【问题描述】:

我有 2 个字符串。这 2 个字符串的大小可能不同。我想看看这两个字符串找到匹配的序列。一旦找到更改,我想在 Capital 中打印该单词,然后继续在我的字符串中,直到找到另一个更改,依此类推。我不知道我会怎么做我试着把单词看成一个整体,但我遇到了问题。基本上我将有 2 个类似 string one="This is a new value" 和 string two= "This This is a new also brand value" 的字符串。我想从一开始就遍历每个字符串并找到匹配的序列,例如 "This is" 在字符串处停止,意识到它随着字符串的添加而改变 改变它转大写然后继续。预期输出="THIS this is a new ALSO BRAND value "

我正在尝试的一些代码。我认为这不是正确的方法。

 static void Main(string[] args)
        {
            string one = "This is a new value";
            string two = "This This is a new also brand value";

            var coll = two.Split(' ').Select(p => one.Contains(p) ? p : p.ToUpperInvariant());

            Console.WriteLine(string.Join(" ", coll));
            Console.ReadKey();
        }

【问题讨论】:

  • 在你的第一个例子中,字符串 one="This is text one" and string two="This is string text two not string one" 你的预期输出是什么 - "This is STRING text TWO NOT STRING一个”或“这是字符串文本,不是字符串一”。如果交换两个字符串,您的预期结果是什么?
  • 我建议阅读一些算法,例如 jaro-winkler en.m.wikipedia.org/wiki/Jaro–Winkler_distance
  • @PaulF 第二个例子是我所期望的。
  • @PaulF 类似这样的东西 value1="This is a new Value"; value2="This is also a new value"; output="This is ALSO a new value"
  • 如果没有任何匹配结果应该是什么: value1="This is a new Value"; value2="abc def ghi jkl mno";

标签: c# string-matching


【解决方案1】:

这就是你要找的吗?描述不是很好,但从答案来看,这似乎是在同一个球场,它使用 LINQ 来减少代码和复杂性。

class Program
{
    static void Main(string[] args)
    {
        string one = "This is text one";
        string two = "This is string text two not string one";

        var coll = two.Split(' ').Select(p => one.Contains(p) ? p : p.ToUpperInvariant());

        Console.WriteLine(string.Join(" ", coll)); // This is STRING text TWO NOT STRING one
        Console.ReadKey();
    }
}

您可以将其分解为一个单独的方法并将变量作为参数传递。

【讨论】:

  • 如果添加一个单词,则仅显示单词,例如 one="this is a new word" two"this is also a new word" 输出“This is ALSO a new word”。这个词很好,但如果我后面还有另一个词,它也不能正常工作。我想要两个“这个词也是全新的”输出“这个词也是全新的”
  • 我无法用我发布的代码重现该问题,string one = "this is a new word"; string two = "this word is also brand new"; //Output "this word is ALSO BRAND new"
  • 你说得对,它确实有效。但是如果我要做这样的事情两个=“这也是新的品牌价值”输出=“这是新的 ALSO BRAND 价值”它应该是“这是新的 ALSO BRAND 价值”
  • 您能否更新您的问题并提供有关您所期望的确切信息、在什么情况下/场景以及重现您未收到预期输出的问题的任何代码的完整信息?这里似乎是一个有点循环的主题,添加了新词。
  • 我更新了我的代码以及我期望的结果
【解决方案2】:

您可以将字符串转换为字符数组并逐个比较字符。我猜你可以使用下面的代码。

string one = "this is string one";
        string two = "this is string one or two";


        char[] oneChar = one.ToCharArray();
        char[] twoChar = two.ToCharArray();
        int index = 0;
        List<char> Diff = new List<char>();

        if (oneChar.Length > twoChar.Length)
        {
            foreach (char item in twoChar)
            {
                if (item != oneChar[index])
                    Diff.Add(item);

                index++;
            }

            for (int i = index; i < oneChar.Length; i++)
            {
                Diff.Add(oneChar[i]);
            }
        }
        else if (oneChar.Length < twoChar.Length)
        {
            foreach (char item in oneChar)
            {
                if (item != twoChar[index])
                    Diff.Add(twoChar[index]);

                index++;
            }

            for (int i = index; i < twoChar.Length; i++)
            {
                Diff.Add(twoChar[i]);
            }
        }
        else//equal length
        {
            foreach (char item in twoChar)
            {
                if (item != oneChar[index])
                    Diff.Add(item);
            }
        }

        Console.WriteLine(Diff.ToArray());//" or two"

【讨论】:

  • 我想输出这样的东西value1="This is a new Value";value2="This is also a new value";output="This is ALSO a new value"
  • 现在您的问题意味着更多。首先,您应该发现差异为 describe 和 toUpper 差异。 'if (item != oneChar[index]) item.toUpper();'但是您需要小心,因为差异字符可能已经是上字符。如果这可能发生在您的情况下,那将是一个问题。
  • 是的,我最初没有很好地描述我的问题。这可能发生在差异已经可能是大字符的地方。你能给我一个例子来说明我是怎么做到的吗?
  • 这取决于你想要什么和你的场景。对你来说“新”、“新”、“新”、“新”等是相同还是不同?因为区别只是小写,大写。如果这些对您来说相似,那么当您比较字符并发现它们不同时,您应该找出字符大小写。像 onechar[i].isLower 并决定大写或小写。但如果 char 是数字,则 islower 返回 false。所以有一个问题,你想解决它,但我认为你的方法不太好。我假设您想向某人展示差异,因此您选择大写,如果您问我使用粗体或更改颜色会更好。
  • 我想让它看看 value1="New" value2="new" output="NEW" 之间的区别
【解决方案3】:

这是你需要的吗? (更新)

var value1 = "This is a new Value";
var value2 = "This is also a new value";
var separators = new[] { " " };
var value1Split = value1.Split(separators, StringSplitOptions.None);
var value2Split = value2.Split(separators, StringSplitOptions.None);
var result = new List<string>();
var i = 0;
var j = 0;
while (i < value1Split.Length && j < value2Split.Length)
{
    if (value1Split[i].Equals(value2Split[j], StringComparison.OrdinalIgnoreCase))
    {
        result.Add(value2Split[j]);
        i++;
        j++;
    }
    else
    {
        result.Add(value2Split[j].ToUpper());
        j++;
    }
}
Console.WriteLine(string.Join(" ", result));
Console.ReadKey();

请注意,如果value1="This is a new Value" 和value2="This is also a new value" 的输出应为"This is ALSO a new value",则value1="This is text one" 和value2="This is string text two not string one" 的输出将为"This is STRING text TWO NOT STRING one",而不是您之前提到的"This is STRING TEXT TWO NOT STRING ONE"。

【讨论】:

  • 这几乎就是我想要的。例如value1="This is a new Value";value2="This is also a new value";output="This is ALSO a new value"
  • 你越来越近了。但是当我输入 value1 = "This is a new value" value2 = "This is also a news value" 时,输出应该是 "value2 = "This is ALSO a NEWS value"" 但是我改为 "This is ALSO a NEWS价值”
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2011-01-07
  • 2019-12-26
  • 2021-08-02
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多