@AndersonGreen, la question était prématurément verrouillée. Les réponses manquent cruellement car ces solutions ne sont pas viables car la plupart des regex ne reconnaissent pas la recherche et le quantificateur de mode . Je crois que le quantificateur existait au moment où la question était posée.
XPMai
Réponses:
261
Vous pouvez effectuer des vérifications en utilisant des lookarounds :
Est-ce que quelqu'un sait pourquoi cela se briserait (au moins en JavaScript) lorsque j'essaie de rechercher des chaînes commençant par «#»? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$ne correspond pas blah #tgif blah #friday blahmais ^(?=.*\bfriday\b)(?=.*\btgif\b).*$fonctionne très bien.
La réponse acceptée a fonctionné. cela a également parfaitement fonctionné pour moi. Pour rechercher du code dans Visual Studio, «trouver des résultats».
Yogurt The Wise
1
Celui-ci fonctionne pour moi et est beaucoup plus concis et facile à comprendre que la réponse acceptée!
Kumar Manish
1
J'avais besoin d'une solution qui n'avait que deux noms pour correspondre, donc cette réponse est plus concise pour ce cas. Mais la réponse acceptée devient plus concise au-delà de 2 puisque le nombre de "ou" augmente factoriellement. Pour 3 noms, il y aurait 6 "ou" s, 4 noms seraient 24 "ou" s, etc.
WileCau
Je recommanderais de le rendre paresseux james.*?jack|jack.*?james. Cela aidera sur les gros textes.
Jekis
42
Explication de la commande que je vais écrire : -
. signifie n'importe quel caractère, chiffre peut remplacer.
* signifie zéro ou plusieurs occurrences de chose écrite juste avant.
|signifie «ou» .
Alors,
james.*jack
chercherait james , puis n'importe quel nombre de caractères jusqu'à ce que jackvient.
En passant, vous pourriez aussi avoir édité la réponse de @ icyrock (qui est la même que la vôtre, à peine 6 ans plus tôt), votre explication est très utile en soi.
WoJ
2
Merci pour cette réponse, je ressens cependant le besoin de préciser que dans la recherche VSCode, votre réponse jack. * James | james. * jack prendra les espaces entre les '|' (ou) symbole en considération lors de la recherche. jack. * james | james. * jack fonctionne et ne cherche pas les espaces
jgritten
2
IF $ _explanation === "génial" ALORS retournez $ THUMBS_UP ENDIF;
Vim a un opérateur de succursale \& qui est utile lors de la recherche d'une ligne contenant un ensemble de mots, dans n'importe quel ordre. De plus, étendre l'ensemble des mots requis est trivial.
Par exemple,
/.*jack\&.*james
correspondra à une ligne contenant jacket james, dans n'importe quel ordre.
Consultez cette réponse pour plus d'informations sur l'utilisation. Je ne connais aucune autre saveur regex qui implémente le branchement; l'opérateur n'est même pas documenté sur l' entrée wikipedia Expression régulière .
Juste au cas où deux jackou deux jamesne seraient pas autorisés, un seul jacket un jamesseraient valides, nous pouvons probablement concevoir une expression similaire à:
Si vous souhaitez simplifier / modifier / explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment il correspondrait à certains exemples d'entrées.
const regex =/^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;const str =`hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;let m;while((m = regex.exec(str))!==null){// This is necessary to avoid infinite loops with zero-width matchesif(m.index === regex.lastIndex){
regex.lastIndex++;}// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Réponses:
Vous pouvez effectuer des vérifications en utilisant des lookarounds :
Essaye-le.
Cette approche présente l'avantage de pouvoir spécifier facilement plusieurs conditions.
la source
vim
syntaxe:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
or\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
ne correspond pasblah #tgif blah #friday blah
mais^(?=.*\bfriday\b)(?=.*\btgif\b).*$
fonctionne très bien.\b
signifie ici?Essayer:
Si vous voulez les deux en même temps, alors
or
les:la source
james.*?jack|jack.*?james
. Cela aidera sur les gros textes.Explication de la commande que je vais écrire : -
.
signifie n'importe quel caractère, chiffre peut remplacer.*
signifie zéro ou plusieurs occurrences de chose écrite juste avant.|
signifie «ou» .Alors,
chercherait
james
, puis n'importe quel nombre de caractères jusqu'à ce quejack
vient.Puisque vous voulez soit
jack.*james
oujames.*jack
D'où la commande :
la source
C'est court et doux
la source
Tu peux faire:
la source
Vim a un opérateur de succursale
\&
qui est utile lors de la recherche d'une ligne contenant un ensemble de mots, dans n'importe quel ordre. De plus, étendre l'ensemble des mots requis est trivial.Par exemple,
/.*jack\&.*james
correspondra à une ligne contenant
jack
etjames
, dans n'importe quel ordre.Consultez cette réponse pour plus d'informations sur l'utilisation. Je ne connais aucune autre saveur regex qui implémente le branchement; l'opérateur n'est même pas documenté sur l' entrée wikipedia Expression régulière .
la source
MÉTHODE 1: Un
jack
et unjames
Juste au cas où deux
jack
ou deuxjames
ne seraient pas autorisés, un seuljack
et unjames
seraient valides, nous pouvons probablement concevoir une expression similaire à:Ici, nous exclurions ces instances de paires en utilisant ces instructions:
et,
Démo RegEx 1
Nous pouvons également simplifier cela pour,
Démo RegEx 2
Si vous souhaitez simplifier / modifier / explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment il correspondrait à certains exemples d'entrées.
Circuit RegEx
jex.im visualise les expressions régulières:
Tester
MÉTHODE 2: Un
jack
et unjames
dans un ordre spécifiqueIl peut également être conçu pour le premier
james
dernierjack
, similaire au suivant:Démo RegEx 3
et vice versa:
Démo RegEx 4
la source
Vous pouvez utiliser la fonction de quantification de regex car elle
lookaround
peut ne pas être prise en charge tout le temps.la source