繁体   English   中英

使用 javascript 中的正则表达式在数组中搜索文本

[英]search text in array using regex in javascript

我对在数组中制作搜索文本非常陌生,数组中的一些元素在游侠中,即在这个 AA 和 A 正则表达式中的某些文本之后它不能是任何东西,我有多维数组,我想要在每个数组中搜索文本。 所以我写了这样的东西。我把 AA* 放在数组中,所以只有前 2 个字符应该匹配,A* 只匹配一个字符。

arr = [
     ["AA*","ABC","XYZ"] ,
    ["A*","AXY","AAJ"]
    ]
    var text = "AA3";
    for ($i=0; $i<arr.length; $i++ ){
        var new_array = [];
        new_array = arr[$i];
        new_array.filter(function(array_element) {
              var result = new RegExp(array_element).test(text);
              
              if( result == true){
                console.log(arr[$i]);
          } 
            
          });
    }

所以我想要的是当text = "AA3"或 double A AA[anything]之后的任何内容和 output 应该是第一个数组,即 ["AA*","ABC","XYZ"] 但我得到两个数组output 并且当text = "A3"时 output 应该是第二个数组,即 ["A*","POI","LKJ"] 但我得到了两个数组。但是如果text = "ABC"text = "AAJ"那么它应该分别是 output 第一个数组或第二个数组。我对如何编写正则表达式一无所知,或者无论如何我可以使用任何其他方法来实现它。 在此先感谢任何建议都会有所帮助。

概括

简而言之,问题是“*”。 在 set 数组的成员中找到的 * 是您每次获得相同数组的原因

详细信息

正则表达式是大多数开发人员难以理解的一个概念(顺便说一句,我就是其中之一😅)。

我将从MDN 上 Regexp的摘录介绍开始

正则表达式是用于匹配字符串中的字符组合的模式 - MDN

考虑到这一点,您想了解您的代码发生了什么。 当您创建像/A*/这样的正则表达式来测试"AA3"时,匹配的将是AAA等。这是 javascript 中的一个真理。 您可能希望与^$进行更严格的匹配,或者将数字与\d严格匹配。

我将您的代码重写为下面的 function:

arr = [
    ["AA*", "ABC", "XYZ"],
    ["A*", "AXY", "AAJ"],
];

findInArray(arr, "AA3") // prints both array
findInArray(arr, "AAJ") // prints second array
findInArray(arr, "ABC") // prints first array

function findInArray(array, value) {
    return array.filter((subArray) =>
        subArray.some((item) => {
            const check = new RegExp(value);
            return check.test(item);
        })
    );
}

问题

问题在于您将每个字符串用作正则表达式。

  • 对于带有*通配符的字符串,这将计算为前一项的零个或多个匹配项,这将始终为true
  • 对于仅由字母数字组成的字符串,这是将字符串与自身进行比较,同样总是给出true
  • 对于包含构成正则表达式语法定义的字符的字符串,这可能会导致错误或意外行为。

MDN 关于 RegExp 量词的文章

改写

假设:

  • 带有*通配符的值始终仅位于第0position,
  • 它的字符串中只有一个这样的通配符,
  • 该问题提到对于text = 'AAJ' AAJ应返回第二个数组,但来自第一个数组的AA*和来自第二个数组的AAJ似乎都与此text匹配。
    因此,我假设通配符只能代表一个数字(正如其他示例所暗示的那样)。

代码:

 const abc = (arrs, text) => { return arrs.filter(arr => { const regex = new RegExp(`^${arr[0].replace('*', '\\d+')}$`); return regex.test(text) || arr.includes(text); }) } const arr = [ ["AA*", "ABC", "XYZ"], ["A*", "AXY", "AAJ"] ]; console.log( `1=[${abc(arr, "AA3")}] 2=[${abc(arr, "ABC")}] 3=[${abc(arr, "AAJ")}]`);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM