正则表达式 - 如何知道给定的字母是否是自定义覆盖百分比的单词的一部分?

时间:2017-08-17 02:16:24

标签: javascript regex

有没有办法建立正则表达式?允许:

  • 检查一个单词的字母是否是给定%
  • 中单词的一部分

例如:

  

鉴于: Wrd (请注意" o&#34的使用情况;)

     

Word

进行比较      

并给出匹配覆盖率的百分比= 60%

     

Wrd 60%(或更多)字母 Word = True

现在另一个案例

  

鉴于: alarxyzwrd

     

Alargeword 比较(请注意 alarxyzwrd 仅匹配 alarwrd ,因为 Alargeword 不包含 xyz 字母(案例确实如此)

     

并给出匹配覆盖率的百分比= 80%

     

alarxyzwrd 只有 70% Alargeword ,正则表达式会忽略此单词或返回False。

要匹配的字母顺序非常重要,因为如果我们尝试匹配 aloha aaaaaa ,每个" a"给出了返回 100%覆盖率的百分比,这是错误的。

我希望存在一个正则表达的天才,帮助我解决这个问题。

2 个答案:

答案 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('');
}