有没有办法建立正则表达式?允许:
例如:
鉴于: Wrd (请注意" o&#34的使用情况;)
与 Word
进行比较并给出匹配覆盖率的百分比= 60%
Wrd 60%(或更多)字母 Word = True
现在另一个案例
鉴于: alarxyzwrd
与 Alargeword 比较(请注意 alarxyzwrd 仅匹配 alarwrd ,因为 Alargeword 不包含 xyz 字母(案例确实如此)
并给出匹配覆盖率的百分比= 80%
alarxyzwrd 只有 70% Alargeword ,正则表达式会忽略此单词或返回False。
要匹配的字母顺序非常重要,因为如果我们尝试匹配 aloha 的 aaaaaa ,每个" a"给出了返回 100%覆盖率的百分比,这是错误的。
我希望存在一个正则表达的天才,帮助我解决这个问题。
答案 0 :(得分:1)
这是我的想法。你可以用给定的单词构建一个正则表达式,比如alarxyzwrd
,就像这样:
(.*?a)?(.*?l)?(.*?a)?(.*?r)?(.*?x)?(.*?y)?(.*?z)?(.*?w)?(.*?r)?(.*?d)?
然后将其与文字匹配,说"AlargeWord"
。然后,您计算匹配的子表达式(
... )?
的数量。这将为您提供总计匹配的字符的百分比。在我的例子中,匹配返回7个非空的子表达式,这意味着7个字母匹配(忽略大小写)。如果您需要知道匹配的字母,您可以在每个子匹配的末尾找到它们。
答案 1 :(得分:0)
只需逐字比较,希望这会有所帮助,请参阅regexp:
Coverage('Alargeword', 'alarxyzwrd');
Coverage('word', 'Wrd');
Coverage('aloha', 'aaaaaa');
// Match chars:
// [ 'A', 'l', 'a', 'r', 'w', 'r', 'd' ]
// Coverage:
// alarxyzwrd has 70% of Alargeword
//
// Match chars:
// [ 'w', 'r', 'd' ]
// Coverage:
// Wrd has 75% of word
//
// Match chars:
// [ 'a', 'a' ]
// Coverage:
// aaaaaa has 40% of aloha
function Coverage(originWord, givenWord) {
var givenString = givenWord.toLowerCase().split('').map(function (char) {
if (originWord.indexOf(char) === -1) {
return '[^' + char + ']*?(' + char + '?)';
} else {
return '[^' + char + ']*(' + char + '?)';
}
}).join('');
var givenReg = new RegExp(givenString, 'i');
var result = originWord.match(givenReg);
var matchChars = result.slice(1).filter(function (char) {
return char;
});
var coverage = matchChars.length / originWord.length;
console.log('Match chars: ');
console.log(matchChars);
console.log('Coverage: ');
console.log(givenWord + ' has ' + coverage*100 + '% of ' + originWord);
console.log('');
}