J'ai besoin d'un ET logique dans regex.
quelque chose comme
jack et james
d'accord avec les chaînes suivantes
'Salut Jack, voici James '
'Salut James, voici Jack '
J'ai besoin d'un ET logique dans regex.
quelque chose comme
jack et james
d'accord avec les chaînes suivantes
'Salut Jack, voici James '
'Salut James, voici Jack '
Réponses:
Vous pouvez effectuer des vérifications en utilisant des lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Cette approche présente l'avantage de pouvoir spécifier facilement plusieurs conditions.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
syntaxe: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
or\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
ne correspond pas blah #tgif blah #friday blah
mais ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
fonctionne très bien.
\b
signifie ici?
Essayer:
james.*jack
Si vous voulez les deux en même temps, alors or
les:
james.*jack|jack.*james
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,
james.*jack
chercherait james
, puis n'importe quel nombre de caractères jusqu'à ce que jack
vient.
Puisque vous voulez soit jack.*james
oujames.*jack
D'où la commande :
jack.*james|james.*jack
C'est court et doux
(?=.*jack)(?=.*james)
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
et 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 .
jack
et unjames
Juste au cas où deux jack
ou deux james
ne seraient pas autorisés, un seul jack
et un james
seraient valides, nous pouvons probablement concevoir une expression similaire à:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Ici, nous exclurions ces instances de paires en utilisant ces instructions:
(?!.*\bjack\b.*\bjack\b)
et,
(?!.*\bjames\b.*\bjames\b)
Nous pouvons également simplifier cela pour,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
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.
jex.im visualise les expressions régulières:
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 matches
if (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}`);
});
}
jack
et un james
dans un ordre spécifiqueIl peut également être conçu pour le premier james
dernier jack
, similaire au suivant:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
et vice versa:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$