C# - 通过在字符串中使用点和使用通配符来比较两个字符串:*
C# - Compare two strings by using dots in the strings and using wildcards: *
我有两个要比较的字符串变量。
var compareA = "something.somethingelse.another.something2"
var compareB = "*.another.something2"
我想比较这个,结果是:正确。
var compareC = "something.somethingelse.*"
与compareA相比,结果也应该是:True.
当然,两个变量都可以包含 N 个点这一事实也使任务复杂化。
你会如何为他开始?
我试过这个:
static void Main(string[] args)
{
var A = CompareString("*.something", "other.Another.something"); //I need this is true!
var B = CompareString("something.Value.Other.*", "something.Value.Other.SomethingElse"); //I need this is true
var C = CompareString("something.Value.Other", "something.Value.Other.OtherElse"); //I need this is False
var D = CompareString("*.somethingElse", "other.another.Value"); //I Need this is false
Console.WriteLine("It is need True: {0}", A);
Console.WriteLine("It is need True: {0}", B);
Console.WriteLine("It is need False: {0}", C);
Console.WriteLine("It is need False: {0}", D);
}
private static bool CompareString(string first, string second)
{
var resume = false;
var firstSplit = first.Split('.');
var secondSplit = second.Split('.');
foreach (var firstItem in firstSplit)
{
foreach (var secondItem in secondSplit)
{
if (firstItem == "*" || secondItem == "*" || string.Equals(firstItem.ToLower(), secondItem.ToLower()))
{
resume = true;
}
else
{
resume = false;
}
}
}
return resume;
}
结果不错,但我觉得可以换个方式,推理可能不对。
假设如下:
- 将 1 个字符串与另一个进行比较,它是 2 个字符串中较长字符串中包含的 1 的完整字符串。
- 案例和文化一样被忽略。
- 句点被视为字符串的一部分,实际上并不是分隔符。
- 通配符可用于说明 1 个字符串如何包含在另一个字符串中。
您应该可以使用以下内容
private bool HasMatch(string textToSearch, string searchText)
{
if (textToSearch.Length < searchText.Length) return false;
var wildCardIndex = searchText.IndexOf('*');
if (wildCardIndex == -1)
{
return textToSearch.Equals(searchText, StringComparison.InvariantCultureIgnoreCase);
}
else
{
if (wildCardIndex == 0)
{
var text = searchText.TrimStart('*');
return textToSearch.EndsWith(text, StringComparison.InvariantCultureIgnoreCase);
}
if (wildCardIndex == (searchText.Length - 1))
{
var text = searchText.TrimEnd('*');
return textToSearch.StartsWith(text, StringComparison.InvariantCultureIgnoreCase);
}
}
return false;
}
我有两个要比较的字符串变量。
var compareA = "something.somethingelse.another.something2"
var compareB = "*.another.something2"
我想比较这个,结果是:正确。
var compareC = "something.somethingelse.*"
与compareA相比,结果也应该是:True.
当然,两个变量都可以包含 N 个点这一事实也使任务复杂化。 你会如何为他开始?
我试过这个:
static void Main(string[] args)
{
var A = CompareString("*.something", "other.Another.something"); //I need this is true!
var B = CompareString("something.Value.Other.*", "something.Value.Other.SomethingElse"); //I need this is true
var C = CompareString("something.Value.Other", "something.Value.Other.OtherElse"); //I need this is False
var D = CompareString("*.somethingElse", "other.another.Value"); //I Need this is false
Console.WriteLine("It is need True: {0}", A);
Console.WriteLine("It is need True: {0}", B);
Console.WriteLine("It is need False: {0}", C);
Console.WriteLine("It is need False: {0}", D);
}
private static bool CompareString(string first, string second)
{
var resume = false;
var firstSplit = first.Split('.');
var secondSplit = second.Split('.');
foreach (var firstItem in firstSplit)
{
foreach (var secondItem in secondSplit)
{
if (firstItem == "*" || secondItem == "*" || string.Equals(firstItem.ToLower(), secondItem.ToLower()))
{
resume = true;
}
else
{
resume = false;
}
}
}
return resume;
}
结果不错,但我觉得可以换个方式,推理可能不对。
假设如下:
- 将 1 个字符串与另一个进行比较,它是 2 个字符串中较长字符串中包含的 1 的完整字符串。
- 案例和文化一样被忽略。
- 句点被视为字符串的一部分,实际上并不是分隔符。
- 通配符可用于说明 1 个字符串如何包含在另一个字符串中。
您应该可以使用以下内容
private bool HasMatch(string textToSearch, string searchText)
{
if (textToSearch.Length < searchText.Length) return false;
var wildCardIndex = searchText.IndexOf('*');
if (wildCardIndex == -1)
{
return textToSearch.Equals(searchText, StringComparison.InvariantCultureIgnoreCase);
}
else
{
if (wildCardIndex == 0)
{
var text = searchText.TrimStart('*');
return textToSearch.EndsWith(text, StringComparison.InvariantCultureIgnoreCase);
}
if (wildCardIndex == (searchText.Length - 1))
{
var text = searchText.TrimEnd('*');
return textToSearch.StartsWith(text, StringComparison.InvariantCultureIgnoreCase);
}
}
return false;
}