String 一个字符串是另一个字符串的一部分的百分比是多少?

String 一个字符串是另一个字符串的一部分的百分比是多少?,string,groovy,compare,spock,String,Groovy,Compare,Spock,Groovy中是否有一个函数类似于VirtualContainesSimilarity,用来表示字符串之间的差异,所以 我想在中搜索“字符串” “这是一条strin”经过比较,可以说83%的字符串“String”出现在“这是一条strin”中。 类似于使用Spock时的断言 断言“字符串”==“字符串” 结果是: “字符串”==“strin” | 假的 1个差异(83%相似性) 斯特林(g) 斯特林(-) 我如何在Groovy中做到这一点?所以不要比较两个字符串,而是要找出字符串a在字符串b中所

Groovy中是否有一个函数类似于VirtualContainesSimilarity,用来表示字符串之间的差异,所以 我想在中搜索“字符串” “这是一条strin”经过比较,可以说83%的字符串“String”出现在“这是一条strin”中。 类似于使用Spock时的断言

断言“字符串”==“字符串”

结果是:

“字符串”==“strin” | 假的 1个差异(83%相似性) 斯特林(g) 斯特林(-)


我如何在Groovy中做到这一点?所以不要比较两个字符串,而是要找出字符串a在字符串b中所包含的部分有多大。如果a是b的一部分->true,否则为false并打印相似性百分比并显示差异所在。

我挖掘了一些Spock代码,使用“相似性”作为关键字,很快就找到了类。Spock中用于计算字符串距离的类。这只取决于
String a = 'string'
String b = 'This is a strin'
println b.containsSimilarity(a)
,因此很容易提取。
如果你想要漂亮的印刷版本,看看。它依赖于TextUtil.escape方法,但它也是可提取的


但请注意,正如Peter Niederwieser所记录的那样,这些类计算Levenshtein距离,而您也注意到,它并不是您所需要的。作者在某地,所以也许他可以给我的答案添加一些有价值的东西。

这不与字符串上的Levenshtein距离有关吗?也许答案是否定的。我的字符串b很长,我想搜索它的一小部分。因此,如果我的字符串b是英文字母表,比较后字符串a是“w”,我希望得到100%的结果,但对于Levenshtein或Jaro Walker,结果将是0.03%甚至更低。这里有一个更相关的方法,谢谢你的回答,但如果我们有s1=“非常好的字符串”,s2=“这是非常严格的”a,结果将是31%,但事实上,16个字母中有10个是相同的,约占63%。因为你的算法从后面切入。只有在发生不相等的问题时,我们才能得到“非常”的5分。
​def s1 = "string", s2 = "This is a strin"
def i = 0, j = 0, l1 = s1.size(), l2 = s2.size()

if (l1 >= l2) {
    large = s1
    small = s2
} else {
    large = s2
    small = s1
}

def percent = 100 / small.size()

def match(large, str) {
    if (large.indexOf(str) == -1) {
        return match(large, str.substring(0, str.size() - 1))
    }
    return str.size()
}

println(Math.round(match(large, small) * percent))  //83
​