Javascript 如何使正则表达式与单词中的任何字母X次匹配?

Javascript 如何使正则表达式与单词中的任何字母X次匹配?,javascript,regex,Javascript,Regex,最近,我开始做一个文字游戏,它涉及到用另一个单词的字母造字。例如,如果你有日耳曼语这个词,你可以在游戏中使用日耳曼语、音调等。你只能使用这个词中可用的字母,而不能重复它们。这意味着虽然在上面的例子中tonic是有效的,但tonico不会,因为条顿语中只有一个o 基本上,我的问题是,如何生成一个正则表达式,以便它搜索字母的一个实例并记住它,这样,在循环的后面给定同一个字母时,就不会再查找它了 因此,如果你有条顿语,并且你正在使用正则表达式搜索tonico t,o,n,i,c,o中的每个字母,你将得

最近,我开始做一个文字游戏,它涉及到用另一个单词的字母造字。例如,如果你有日耳曼语这个词,你可以在游戏中使用日耳曼语、音调等。你只能使用这个词中可用的字母,而不能重复它们。这意味着虽然在上面的例子中tonic是有效的,但tonico不会,因为条顿语中只有一个o

基本上,我的问题是,如何生成一个正则表达式,以便它搜索字母的一个实例并记住它,这样,在循环的后面给定同一个字母时,就不会再查找它了

因此,如果你有条顿语,并且你正在使用正则表达式搜索tonico t,o,n,i,c,o中的每个字母,你将得到除最后一个o之外的所有字母的真值

如果你有Pencil这个词,你可以用pen、line和pile来表示,但不能用Pipe

或者,如果你有小的,你会得到真正的商场,商场,但不是大规模的

编辑:

非常感谢您的及时回复! 我怀疑使用regex方法是不可能的,但我想确定一下。取而代之的是,我尝试了一点数组方法,认为我没有走多远


再次感谢各位

我不确定这是否适合正则表达式的用例?我想,因为你想用原始单词中的字母,按照它们出现的不同顺序,表达不再是规则的

我可以想象,如果能够做到这一点,它将需要使用非常复杂的反向引用

我个人会使用某种自定义的或预先存在的特定于域的算法来攻击它


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

我不确定这是否适合正则表达式的用例?我想,因为你想用原始单词中的字母,按照它们出现的不同顺序,表达不再是规则的

我可以想象,如果能够做到这一点,它将需要使用非常复杂的反向引用

我个人会使用某种自定义的或预先存在的特定于域的算法来攻击它


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

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

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');

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

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');

正则表达式并不适合这个任务。我将为源字符串和目标字符串建立字符->出现次数的散列,然后比较目标散列中的计数,以确保它们都是Regex不适合此任务。我会为源字符串和目标字符串建立一个字符->出现次数的散列,然后比较目标散列中的计数,以确保它们都是我认为正则表达式不会解决您的问题的。一个算法答案对你来说足够了吗?如果是这样的话,我会写点东西。@Fabricio Matté:我真丢脸:-S@xdazz:有人需要意识到,可用的编程语言不止一种:-S@zerkms别担心,我也会经历太多的时间,所以。=]在主题中,您可能需要重写或添加一些逻辑来计算每个字符中有多少个在对象中可用,因为您可能有一些代码来存储哪些字符可用,当试图挑选一封信时,存储它们的数量并检查使用的数量与总共可用的数量的对比应该不是什么大问题。不幸的是,我更擅长使用代码而不是文字,因此如果没有可编译的示例,我很难给出正确的答案,因此我将其作为注释。我认为正则表达式无法解决您的问题。一个算法答案对你来说足够了吗?如果是这样的话,我会写点东西。@Fabricio Matté:我真丢脸:-S@xdazz:有人需要意识到,可用的编程语言不止一种:-S@zerkms别担心,我也会经历太多的时间,所以。=]在主题中,您可能需要重写或添加一些逻辑来计算每个字符中有多少个在对象中可用,因为您可能有一些代码来存储哪些字符可用,当试图挑选一封信时,存储它们的数量并检查使用的数量与总共可用的数量的对比应该不是什么大问题。不幸的是,我更擅长使用代码而不是文字,因此如果没有可编译的示例,我很难给出正确的答案,因此我将其作为注释。我认为基于哈希的方法更适合解决此问题,特别是因为游戏需要将多个文字与固定源进行比较。使用散列更快,我认为比到处拆分和拼接字符串更干净。基于散列的方法更适合大型数组,构建散列表的操作有一些开销,我认为在单个单词的情况下,它不适合使用基于散列的方法
对于这个问题更好,特别是因为游戏需要将许多单词与固定来源进行比较。使用散列更快,而且我认为比到处拆分和拼接字符串更干净。基于散列的方法更适合大型数组,构建散列表的操作有一些开销,我认为对于单个单词来说,它不适合Hank you!我以前从未使用过哈希,所以我将对此进行研究并进行测试。谢谢!我以前从未使用过哈希,因此我将对此进行研究并进行测试。
// 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;

*/