1

最近,我开始制作一个文字游戏,其中涉及从另一个单词的字母中制作单词。例如,如果您有“Teutonic”一词,则可以制作“tonic”、“tone”等。在游戏中,您只能使用单词中可用的字母,而不能重复。这意味着虽然“tonic”在上述示例中有效,但“tonico”无效,因为“Teutonic”中只有一个“o”。

我的问题基本上是,我怎样才能制作一个正则表达式,以便它搜索字母的一个实例并记住它,以便在循环中稍后给出相同的字母时不再查找它?

因此,如果您有“Teutonic”并且您正在使用正则表达式搜索“tonico”(“t”,“o”,“n”,“i”,“c”,“o”)中的每个字母,你会得到除最后一个“o”外,每个都为“true”。

如果你有“铅笔”这个词,你会得到“笔”、“线”和“桩”,但不是“管”。

或者如果你有“小”,你会得到“商场”,“商场”而不是“大众”。


编辑:

非常感谢您的所有及时回复!我怀疑使用正则表达式方法是不可能的,但我想确定一下。相反,我对数组方法进行了一些实验,以为我没有走得太远。

再次感谢各位!

4

4 回答 4

6

将字符串拆分为数组,然后与数组进行比较。

function checkStr(str1, str2) {
  var arr1 = str1.split(''),
      arr2 = str2.split(''),
      i,j;
  for (i = 0; i < arr2.length; i++) {
     if ((j= arr1.indexOf(arr2[i])) === -1) {
        return false;
     } 
     arr1.splice(j, 1);
  }
  return true;
}
// usage
checkStr('small', 'mall');
于 2012-08-27T04:08:20.203 回答
2

正则表达式不适合这项任务。我会为源和目标字符串建立一个哈希(character -> occurrences),然后比较目标哈希中的计数以确保它们都是 <= 源哈希中的相应计数。

如果你把这个逻辑放在一个对象中,你可以只构建一次源哈希,然后对它进行多次测试(jsFiddle 版本):

function Comparer(sourceStr)
{
    this.buildHash = function(str)
    {
        var hash = new Object();
        for (var i in str)
            hash[str[i]] = (hash[str[i]] || 0) + 1;

        return hash
    };

    this.check = function(testStr)
    {
        var hash = this.buildHash(testStr);

        for (var c in hash)
            if ((this.sourceHash[c] || 0) < hash[c])
                return false;

        return true;
    };     

    this.source = sourceStr;
    this.sourceHash = this.buildHash(sourceStr);
};

var comp = new Comparer("teutonic");
alert(comp.check("tonic"));  // true
alert(comp.check("tint"));   // true
alert(comp.check("tonico")); // false
alert(comp.check("asdf"));   // false
于 2012-08-27T04:53:27.200 回答
0

我不确定这是正则表达式的合适用例吗?我认为因为您正在寻找使用原始单词中的字母,以与它们出现的不同顺序,表达不再是“常规”。

我想如果可以做到的话,将需要使用非常复杂的反向引用。

我会使用某种自定义(或预先存在的特定于域的)算法亲自对此进行攻击。

但我必须承认我不是一个正则表达式专家,很高兴被证明是错误的!

于 2012-08-27T04:04:41.080 回答
0
// It may not matter, but you can also compare strings without creating arrays.

String.prototype.contains= function(word){
    var seed= String(this), i= 0, len= word.length, next= '';
    while(i<len){
        next= word.charAt(i++);
        if(seed.indexOf(next)== -1) return false;
        seed= seed.replace(next, '');
    }
    return word;
}


//testing 
var startword= 'teutonic',report='startword= '+startword, 
list= ['ton', 'on', 'out', 'tout', 'tone', 'tonic', 'tune', 'nice', 
'note', 'not','tot', 'tote', 'ice', 'tic', 'nick', 'cone', 'con', 'cut', 'cute'];

var failed=list.filter(function(itm){
    return !startword.contains(itm);
});

report+= failed.length? '\n'+failed.length+' incorrect: '+failed+';\n':'';
report+=list.length+' correct: '+list+';\n';
alert(report);


/*  returned value: (String)
startword= teutonic
1 incorrect: nick;
19 correct: ton,on,out,tout,tone,tonic,tune,nice,note,
not,tot,tote,ice,tic,nick,cone,con,cut,cute;

*/
于 2012-08-27T06:34:25.257 回答