javascript 需要正则表达式才能从数组中提取完全匹配的字符串数据

ut6juiuv  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(100)

我想匹配和存储字符串在一个数组中使用javascript和需要正则表达式。其他解决方案也赞赏。由'_'分隔,如果只有两个匹配字符串中的那些字符串从数组应该只返回,没有其他匹配应该接受。数组和搜索字符串都是动态的。下面只是一个例子,但解决方案应该匹配任何动态数据。示例问题如下。

let arr1 = ['ef','cd','ab','cdab','efab','cdef','ab/cd/ef','cd/ef,ab','cd/ab','ab/ef']

测试场景:
1.令搜索=“ef_ab”;预期输出为[“efab”,“ab/ef”]
1.令搜索=“ab_cd_ef”;预期输出为['ab/cd/ef','cd/ef,ab']
1.让搜索=“cd”;预期输出应为[“cd”]
任何帮助javascript的问题是赞赏。
我试过下面的正则表达式和循环。这里,给定示例中的word 1可以是ab或cd或ef,word 2和word 3也可以是相同的

let arr1 = ['ef', 'cd', 'ab', 'cdab', 'efab', 'cdef', 'ab/cd/ef', 'cd/ef,ab', 'cd/ab', 'ab/ef']

let regex = /(?=.*word1)(?=.*word2)(?=.*word3)/;

let arr2 = [];

for (i = 0; i < arr1.length; i++) {
  if (regex.test(arr1[i]))
    arr2.push(arr1[i]);
}
console.log(arr2)
4nkexdtk

4nkexdtk1#

您可以使用输入来形成一系列正则表达式模式,每个模式都必须与输入字符串匹配。与所有正则表达式模式匹配的输入是有效匹配。

var arr1 = ['ef','cd','ab','cdab','efab','cdef','ab/cd/ef','cd/ef,ab','cd/ab','ab/ef'];
var search = 'ab_cd_ef';
var parts = search.split("_");
for (var i=0; i < arr1.length; ++i) {
    var counter = 0;
    for (var p=0; p < parts.length; ++p) {
        var r = new RegExp("\\b" + parts[p] + "\\b");
        if (r.test(arr1[i])) {
            ++counter;
        }
    }
    if (counter == parts.length) {
        console.log(arr1[i] + " => MATCH");
    }
}
vs91vp4v

vs91vp4v2#

我们需要进行一些排列:

// Heap's algorithm https://stackoverflow.com/a/66122464/295783
const excluding = (i) => (xs) => [... xs.slice (0, i), ... xs.slice (i + 1)]; 
const permutations = (xs) => xs.length == 0 ? [[]] : xs.flatMap ((x, i) => permutations (excluding (i) (xs)).map (p => (x +' '+ p).trim()));

const findSequence = (arr,str) => {
  const parts = str.split("_");
  const re = new RegExp(`^${permutations(parts)  // ^ from start
    .map(part => `${part.replace(/ /g,".?")}`)   // with a character or not in between
    .join('|')}$`);                              // to end $ of each string
  console.log(re); // just to show the resulting regexp
  return arr.filter(item => item.match(re)); 
}
let arr1 = ['ef', 'cd', 'ab', 'cdab', 'efab', 'cdef', 'ab/cd/ef', 'cd/ef,ab', 'cd/ab', 'ab/ef']

console.log(findSequence(arr1,'ef_ab')) // ['efab','ab/ef']
console.log(findSequence(arr1,'ab_cd_ef')) // ['ab/cd/ef','cd/ef,ab']
console.log(findSequence(arr1,'cd')) // ['cd']

相关问题