大多数字符相似时如何识别两个字符串
我希望在这个样本中得到true
"Hello Wolrld" == "HelloWorld"
要么
"hello world!!" == "helloworld"
我知道这些并不相同,但由于大多数角色都是一样的,这对我来说已经足够了
提前致谢
用这个
Regex.Replace(textBox1.Text, @"[^0-9a-zA-Z]+", "").ToLower() == your string in lower case
您可以计算两个字符串的Levenshtein distance(例如参见此C# implementation),然后定义一个阈值,您可以将该字符串视为“相等”。
合理的门槛取决于您的要求。也许,将谓词定义为d <= a * Math.Min(string1.Length, string2.Length)
应该有效,其中d
是字符串的Levenshtein距离,而a
是0和1之间“相似性”的因素。在你的例子中,a==0.3
应该有用。
如果您正在寻找一个非常基本的检查,您可以使用Zip
对字符进行枚举来比较它们,计算匹配的字母,如果匹配数超过某个阈值,则报告为真。如果一个字符串是另一个字符串的移位版本,则不会捕获它;它只会在同一个索引处捕获共同的字母。
public static class ExtensionMethods
{
public static bool FuzzyCompare(this string lhs, string rhs, float ratioRequired)
{
var matchingLetters = lhs.Zip
(
rhs,
(a,b) => a == b ? 1 : 0
)
.Sum();
return (float)matchingLetters / (float)lhs.Length > ratioRequired;
}
}
要比较两个字符串以查看它们是否匹配至少一半的字母,请传递0.5的ratioRequired
。
public static void Main()
{
var a = "ABCD";
var b = "ABCDEFGHI";
Console.WriteLine( a.FuzzyCompare(b, 0.5F) );
}
输出:
True
如果80%的单词是相似的,那么这是真的。试试这个
String str1 = "Hello world";
String str2 = "Helloworld!!";
char[] charArray;
int per = 0;
int c = 0;
if (str1.length() > str2.length()) {
per = (str1.length() * 80) / 100; // 80% per match logic
charArray = str1.toCharArray();
for (int i = 0; i < str1.length(); i++) {
String chars = String.valueOf(charArray[i]);
if (str2.contains(chars)) {
c++;
}
}
} else {
per = (str1.length() * 80) / 100; // 80% per match logic
charArray = str2.toCharArray();
for (int i = 0; i < str2.length(); i++) {
String chars = String.valueOf(charArray[i]);
if (str1.contains(chars)) {
c++;
}
}
}
if (c >= per) {
Toast.makeText(getApplicationContext(), "true", 0).show();
} else {
Toast.makeText(getApplicationContext(), "false", 0).show();
}