Maison  >  Questions et réponses  >  le corps du texte

Comment puis-je simplifier cette expression régulière ?

J'ai cette expression régulière :

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

Cela correspond à ces mots :

WORD1WORD2WORD3
WORD1AWORD2BWORD3C
WORD3WORD1WORD2
WORD1WORD2WORD3WORD1

Mais pas ces mots :

WORD1WORD1WORD2
WORD1AWORD1BWORD2C

Cette expression rationnelle correspond lorsqu'elle trouve une chaîne contenant 3 mots (WORD1WORD2WORD3) dans n'importe quel ordre.

Je veux faire la même chose avec plus de mots, mais le problème est que la taille de l'expression régulière augmente de façon exponentielle avec le nombre de mots. Est-il possible de simplifier la façon dont cette expression régulière est construite pour résoudre ce problème (sans croître de façon exponentielle en taille) ?

P粉710454910P粉710454910235 Il y a quelques jours351

répondre à tous(2)je répondrai

  • P粉663883862

    P粉6638838622024-02-27 16:51:16

    Parcourez simplement toutes les chaînes et filtrez toutes les chaînes qui ne contiennent pas tous les mots-clés :

    (Une version plus concise peut être trouvée dans l'extrait de code ci-dessous)

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

    Essayez-le :

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

    répondre
    0
  • P粉998100648

    P粉9981006482024-02-27 11:50:29

    Vous pouvez utiliser une anticipation positive pour chaque mot.

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

    Une version plus performante ci-dessous précise l'ancre de départ et ne correspond qu'à un seul caractère après validation de l'anticipation. À la demande d'OP, cette technique ne fonctionne qu'avec matching,而不适用于extraction.

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

    L'analyse prospective est comme une porte, elle ne continuera que si la correspondance spécifiée entre parenthèses existe, mais elle ne consommera ni ne capturera ce à quoi elle correspond - sa longueur est toujours nulle. L'ordre des mots n'a pas d'importance si vous « regardez devant » pour voir s'il y a un .* précédant chaque mot. Si chaque mot est vrai, continuez sans rien utiliser pour la correspondance.

    Si vous vous souciez uniquement de savoir si le contenu correspond, la seule différence substantielle entre les deux expressions est le temps qu'elles prennent. Disons que vous n'avez que 2 des 3 mots requis dans votre contenu. À moins que le logiciel interprétant l'expression puisse reconnaître que la tentative est vaine, il peut rechercher les trois mots « échoué » en première position, puis essayer « échoué » en deuxième position, et ainsi de suite jusqu'à ce qu'il atteigne la dernière position. en haut. Certaines captures inutiles peuvent être évitées en précisant ^,只会在第一个位置进行检查,节省了其他不必要检查的时间。当您只是寻找内容中是否存在所有单词的真/假答案时,从末尾删除 *.

    répondre
    0
  • Annulerrépondre