正则表达式:AND行为

时间:2017-07-06 08:46:16

标签: javascript regex

我正在学习Javascript中的正则表达式

我已经看到很多方法可以通过OR运算符与[]组中的|()进行独占匹配。

我无法理解如何使用正则表达式实现AND行为。我做了一些研究,但没找到我需要的东西。

这是一个例子。我有以下字符串:kata。我想将它与另一个字符串进行比较:steak
如果true中的所有字母都包含在steak中,则目标是返回kata。如果我使用这个正则表达式[steak]它返回true但实际上它应该返回false,因为在kata中没有“s”。

示例2. String1 = scriptsjavastring2 = javascript,result = true(因为string2包含在string1中)

示例3. String1 = jscriptsstring2 = javascript,result = false(因为string2未完全包含在string1中)

示例4. String1 = rkqodlwstring2 = world,result = true(因为字符串世界位于第一个字符串中)

我认为使用正则表达式是最好的方法,我认为string2是一种模式。我对此问题的解决方案如下

 var validate=true;
 var counter = 0;
 str2.split("").map(val => {
   counter++;
    var char = new RegExp(val);

    if (char.test(str1) === false) { validate = false;} else 
    { 
    str1 = str1.slice(0, counter+1) + str1.slice(counter+1,str1.length);
    console.log(str1);
    }

 });
 return validate;

我认为不是最有效率的。你有更好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

下面的原型函数循环遍历字符串的字符以进行比较。

并检查每个角色是否可以找到&替换为与其进行比较的字符串。
如果没有,则返回false。

String.prototype.ContainsCharactersOf = function(str2) {
   if (this.length < str2.length) return false;
   var str1 = this;
   for (i = 0; i < str2.length; i++) {
     if (str1.indexOf(str2[i])<0) return false;
     str1 = str1.replace(str2[i],"");
   }
   return true;
}

//TRUE examples: 

console.log("scriptsjava".ContainsCharactersOf("javascript")); //same characters
console.log("rkqodlw".ContainsCharactersOf("world")); //has all with extra

//FALSE examples :

console.log("jscripts".ContainsCharactersOf("javascript")); //smaller, so can't have 'em all   
console.log("helooo".ContainsCharactersOf("hello")); //missing a second 'l'

回答关于正则表达式中“AND”行为的标题 要拥有一个像正则表达式一样的正则表达式,你可以为单词的每个字母链接正向前瞻 F.E.一个正则表达式,用于查看包含“steak”中所有字符的所有单词的文本:

\b(?=\w*s)(?=\w*t)(?=\w*a)(?=\w*e)(?=\w*k)\w+\b

答案 1 :(得分:0)

您需要进行集合比较,特别是超集检查。简单的Set

let s1 = 'javascript';
let s2 = 'scriptsjava';

Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false;
        }
    }
    return true;
}

console.log(new Set(s1).isSuperset(new Set(s2)));

答案 2 :(得分:0)

这是我的第二个答案,如果我发现这似乎对你有帮助,我可能会在之后删除之前的答案。

虽然有一些很好的答案被发布但是我可以看到你想要在正则表达式中保持AND操作,因此你想要一个regexAND答案。因此,我将根据您的需要给您一个答案。但是,如果你想让我坦率,那么我会说,对于你的要求,正则表达式操作是我想要的最后一种选择。

现在回答:

对于每一对,请说str1和str2。您想要查看str2中是否存在str2的每个字符。

因此,您可以为整个str2字符串的每个字符以正向前瞻的形式进行AND操作,并查看是否所有这些都存在于str1中。 每个positie lookahead看起来都像这样:(?=。* w)

当像下面提到的正则表达式一样写在另一个旁边时,它们就像AND一样。

例如: STR1 =&#34; rkqodlw&#34; STR2 =&#34;世界&#34;

按以下方式通过str2制作正则表达式:

^(?=.*w)(?=.*o)(?=.*r)(?=.*l)(?=.*d).*$

并查看它是否与str1匹配

像这样:

&#13;
&#13;
function compare(str1,str2)
{
 var regexAnd=str2.split("").join(")(?=.*");
 var regexStr="^"+"(?=.*"+regexAnd+").*$";
 console.log(regexStr);  // prints the entire and condition
 
 var re = new RegExp(regexStr,"gm");

 return re.test(str1);

}

console.log(compare("scriptsjava","javascript"));
console.log(compare("jscripts","javascript"));
console.log(compare("rkqodlw","world"));
&#13;
&#13;
&#13;