javascript 如何使sipmlify这个正则表达式?

gojuced7  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(170)

我有这个regex:

"(WORD1.*WORD2.*WORD3)|(WORD1.*WORD3.*WORD2)|(WORD2.*WORD1.*WORD3)|(WORD2.*WORD3.*WORD1)|(WORD3.*WORD1.*WORD2)|(WORD3.*WORD2.*WORD1)"

它与这些单词匹配:

WORD1WORD2WORD3
WORD1AWORD2BWORD3C
WORD3WORD1WORD2
WORD1WORD2WORD3WORD1

但不是这些话:

WORD1WORD1WORD2
WORD1AWORD1BWORD2C

当它找到一个字符串,其中有3个字(WORD1WORD2WORD3)以任何顺序时,该正则表达式进行匹配。
我想对更多的单词做同样的事情,但问题是正则表达式的大小随着单词的数量呈指数级增长。有没有可能简化这个正则表达式的构造方式来解决这个问题(大小不会呈指数级增长)?

qgelzfjb

qgelzfjb1#

只需迭代所有字符串,并过滤掉所有不包含所有关键字的字符串:
(更简洁的版本可以在下面的片段中找到)

function findMatch(strings, keywords) {
  const result = [];
  
  for (const string of strings) {
    if (keywords.every(keyword => string.includes(keyword))) {
      result.push(string);
    }
  }
  
  return result;
}

试试看:

console.config({ maximize: true });

function findMatch(strings, keywords) {
  return strings.filter(
    string => keywords.every(keyword => string.includes(keyword))
  );
}

const testcases = [
  'WORD1WORD2WORD3',
  'WORD1AWORD2BWORD3C',
  'WORD3WORD1WORD2',
  'WORD1WORD2WORD3WORD1',
  'WORD1WORD1WORD2',
  'WORD1AWORD1BWORD2C'
];

const keywords = [
  'WORD1', 'WORD2', 'WORD3'
];

console.log(findMatch(testcases, keywords));
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
wn9m85ua

wn9m85ua2#

你可以对每个单词使用正向前看。

/(?=.*WORD1)(?=.*WORD2)(?=.*WORD3).*/

下面的更高性能版本指定了一个起始锚,并且在验证lookaheads后只匹配单个字符。根据OP的要求,此技术仅适用于matching,不适用于extraction

/^(?=.*WORD1)(?=.*WORD2)(?=.*WORD3)./

相关问题