【问题标题】:Regular Expressions: AND behavior正则表达式:AND 行为
【发布时间】:2017-12-10 04:03:14
【问题描述】:

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

我见过很多通过 OR 运算符与 []| 在组 () 中进行排他匹配的方法。

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

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

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

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

示例4.String1 = rkqodlw,string2 = 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;

我认为这不是最有效的。您对此有更好的解决方案吗?

【问题讨论】:

  • 你最好举几对例子,并写下你对每一对的期望,因为它看起来有点混乱
  • 您可以添加您使用的语言吗?正则表达式解决方案很可能不是解决它的最佳方法。
  • 正则表达式的工作不是“比较两个字符串”,而是将模式描述与字符串进行匹配。您需要更好地定义您正在尝试做什么,并且可能需要一个不同的工具来完成它。
  • 你使用什么语言?
  • 您是否要检查s1 中的所有字母是否也必须出现在s1 中,包括如果s1 中有两个“b”,那么必须有至少s2 中也有两个“b”?

标签: javascript regex


【解决方案1】:

您想要一个集合比较,特别是超集检查。简单的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】:

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

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

    现在答案来了:

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

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

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

    例如: str1="rkqodlw" str2="世界"

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

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

    看看是否与str1匹配

    像这样:

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

    【讨论】:

    • @L. Pier Roberto 请看看这是否回答了你的问题,我认为是的
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2018-01-23
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多