C# 在C中匹配2个字符串#
我有两条线。这两个字符串的大小可能不同。我想看看这两个字符串,寻找匹配的序列。一旦我找到一个变化,我想用大写字母打印这个单词,然后继续在字符串中打印,直到我找到另一个变化,依此类推。我不确定我会怎么做,我试着把单词作为一个整体来看待,但我有一些问题。基本上,我会有两个字符串,比如C# 在C中匹配2个字符串#,c#,string-matching,C#,String Matching,我有两条线。这两个字符串的大小可能不同。我想看看这两个字符串,寻找匹配的序列。一旦我找到一个变化,我想用大写字母打印这个单词,然后继续在字符串中打印,直到我找到另一个变化,依此类推。我不确定我会怎么做,我试着把单词作为一个整体来看待,但我有一些问题。基本上,我会有两个字符串,比如stringone=“这是一个新值”和stringtwo=“这也是一个新的品牌值””。我想从一开始就检查每个字符串,找到匹配的序列,例如“This is”在字符串处停止,意识到它在添加字符串时发生了变化,将其更改为大写,
stringone=“这是一个新值”
和stringtwo=“这也是一个新的品牌值”
”。我想从一开始就检查每个字符串,找到匹配的序列,例如“This is”在字符串处停止,意识到它在添加字符串时发生了变化,将其更改为大写,然后继续。预期输出=“这也是一个新的品牌价值”
我正在尝试的一些代码。我认为这不是正确的方法
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();
}
您可以将字符串转换为字符数组并逐个比较字符。我想您可以使用以下代码
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"
stringone=“这是stringone”;
stringtwo=“这是stringone或stringtwo”;
char[]oneChar=1.ToCharArray();
char[]twoChar=two.ToCharArray();
int指数=0;
List Diff=新列表();
if(oneChar.Length>twoChar.Length)
{
foreach(两个字符中的字符项)
{
if(item!=oneChar[索引])
差异添加(项目);
索引++;
}
for(int i=index;i
这就是你需要的吗?(更新)
var value1=“这是一个新值”;
var value2=“这也是一个新值”;
变量分隔符=新[]{”“};
var value1Split=value1.Split(分隔符、StringSplitOptions.None);
var value2Split=value2.Split(分隔符、StringSplitOptions.None);
var result=新列表();
var i=0;
var j=0;
而(i
请注意,如果对于
value1=“这是一个新值”
和value2=“这也是一个新值”
输出应该是“这也是一个新值”
,而对于value1=“这是文本一个”
和value2=“这是字符串文本二不是字符串一个”
输出将是“这是字符串文本二不是字符串一”
,而不是“这是字符串文本二而不是字符串一”
,正如您前面提到的。这就是您要找的吗?描述并不精彩,但从答案来看,这似乎是在同一个球场,它使用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();
}
}
您可以将其分解为一个单独的方法,并将变量作为参数传入。在string one=“this is text one”和string two=“this is string text two not string one”的第一个示例中,您的预期输出是什么-“this is string text two not string one”或“this is string text two not string one”。如果这两个字符串被交换,你期望得到什么结果?我建议你阅读一些算法,比如jaro winkler–winkler_distance@PaulF第二个例子是我所期望的。@PaulF类似这样的
value1=“这是一个新值”
value2=“这也是一个新值”
output=“这也是一个新值”
如果任何内容都不匹配,那么结果应该是什么:value1=“这是一个新值”;value2=“abc def ghi jkl mno”;这几乎就是我想要的。例如value1=“这是一个新值”
value2=“这也是一个新值”
output=“这也是一个新值”
您越来越接近了。但是,当我输入value1=“这是一个新值”value2=“这也是一个新值”时,输出应该是“value2=“这也是一个新值”,但我改为“这也是一个新值”,我想输出类似的内容value1=“这是一个新值”
value2=“这也是一个新值”
output=“这也是一个新值”
现在您的问题意味着更多。首先,你应该发现差异是一种描述和夸大的差异如果(item!=oneChar[index])item.toUpper();'但是您需要小心,因为差异字符可能已经是上字符了。如果这种情况发生在你的情况下,那将是一个问题。是的,我最初没有很好地描述我的问题。这可能发生在差异可能已经是上字符的地方。你能给我举个例子说明我是如何做到这一点的吗?这取决于你想要什么和你的场景。对你们来说,“新”、“新”、“新”、“新”等等是相同的还是不同的?因为不同的只是小写,大写。如果这些对您来说是相似的,那么当您比较字符并发现它们不同时,您应该找出字符大小写。像onechar[i]一样,使用小写并决定大写或小写。但如果char是一个数字,islower将返回false。所以有一个问题,你想解决它,但我认为你的方法不太好。我想你想向别人展示你的不同,所以你选择
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();
}
}