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 (WORD1
、WORD2
、WORD3
) 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) ?
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)
Essayez-le :
Vous pouvez utiliser une anticipation positive pour chaque mot.
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
.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. p>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
^
,只会在第一个位置进行检查,节省了其他不必要检查的时间。当您只是寻找内容中是否存在所有单词的真/假答案时,从末尾删除*
.