Je n'ai pas été en mesure de trouver une expression régulière appropriée pour correspondre à une chaîne ne se terminant pas par une condition. Par exemple, je ne veux pas faire correspondre quoi que ce soit se terminant par un a
.
Cela correspond
b
ab
1
Cela ne correspond pas
a
ba
Je sais que l'expression régulière devrait se terminer par $
pour marquer la fin, même si je ne sais pas ce qui devrait la précéder.
Edit : La question originale ne semble pas être un exemple légitime pour mon cas. Alors: comment gérer plus d'un personnage? Dites quelque chose qui ne se termine pas par ab
?
J'ai pu résoudre ce problème en utilisant ce fil :
.*(?:(?!ab).).$
Bien que l'inconvénient soit que cela ne correspond pas à une chaîne d'un caractère.
Réponses:
Vous ne nous donnez pas le langage, mais si votre support de saveur regex regarde derrière l'assertion , voici ce dont vous avez besoin:
(?<!a)
est une assertion de regard inversé qui garantit qu'avant la fin de la chaîne (ou de la ligne avec lem
modificateur), il n'y a pas le caractère "a".Voir ici sur Regexr
Vous pouvez également facilement l'étendre avec d'autres caractères, car cette vérification de la chaîne n'est pas une classe de caractères.
Cela correspondrait à tout ce qui ne se termine pas par "ab", voyez-le sur Regexr
la source
Utilisez le symbole not (
^
):Si vous mettez le
^
symbole au début des crochets, cela signifie «tout sauf les choses entre crochets».$
est simplement une ancre vers la fin.Pour plusieurs personnages , placez-les tous dans leur propre jeu de caractères:
la source
ae
oucb
.Pour rechercher des fichiers ne se terminant pas par ".tmp", nous utilisons l'expression régulière suivante:
Testé avec le testeur Regex donne le résultat suivant:
la source
^.*(?![.]tmp$)
pas?.*
correspond déjà à toute la chaîne, donc l'exclusion restante ne fonctionne plus.l'expression régulière ci-dessus correspondra aux chaînes qui ne se terminent pas par
a
.la source
Essaye ça
Le
[]
désigne une classe de caractères et l'^
inverse la classe de caractères pour correspondre à tout sauf una
.la source
La question est ancienne mais je n'ai pas pu trouver de meilleure solution je poste la mienne ici. Trouvez toutes les clés USB sans lister les partitions , supprimant ainsi la «partie [0-9]» des résultats. J'ai fini par faire deux grep, le dernier annule le résultat:
Cela se traduit sur mon système:
Si je veux seulement les partitions, je pourrais faire:
Où j'arrive:
Et quand je fais:
Je reçois:
la source
La réponse acceptée est bonne si vous pouvez utiliser des lookarounds. Cependant, il existe également une autre approche pour résoudre ce problème.
Si nous regardons le regex largement proposé pour cette question:
.*[^a]$
Nous verrons que cela fonctionne presque . Il n'accepte pas une chaîne vide, ce qui pourrait être un peu gênant. Cependant, il s'agit d'un problème mineur lorsqu'il s'agit d'un seul personnage. Cependant, si nous voulons exclure la chaîne entière, par exemple "abc", alors:
.*[^a][^b][^c]$
ne fera pas. Il n'acceptera pas de courant alternatif, par exemple.
Il existe cependant une solution simple à ce problème. On peut simplement dire:
.{,2}$|.*[^a][^b][^c]$
ou version plus généralisée:
.{,n-1}$|.*[^firstchar][^secondchar]$
où n est la longueur de la chaîne que vous voulez interdire (carabc
c'est 3), etfirstchar
,,secondchar
... sont les premier, deuxième ... nième caractères de votre chaîne (carabc
ce seraita
, alorsb
, alorsc
).Cela vient d'une simple constatation qu'une chaîne plus courte que le texte que nous n'interdirons pas ne peut pas contenir ce texte par définition. Nous pouvons donc soit accepter tout ce qui est plus court ("ab" n'est pas "abc"), ou tout ce qui est assez long pour que nous l'acceptions mais sans la fin.
Voici un exemple de recherche qui supprimera tous les fichiers qui ne sont pas .jpg:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete
la source
.{,2}$|.*[^a][^b][^c]$
ne correspond pasccc
Tout ce qui correspond à quelque chose se terminant par un ---
.*a$
Ainsi, lorsque vous correspondez à l'expression régulière, annulez la condition ou vous pouvez également faire.*[^a]$
où[^a]
signifie tout ce qui estnot a
la source
Si vous utilisez
grep
oused
la syntaxe sera un peu différente. Notez que la[^a][^b]
méthode séquentielle ne fonctionne pas ici:FWIW, je trouve les mêmes résultats dans Regex101 , qui je pense est la syntaxe JavaScript.
Mauvais: https://regex101.com/r/MJGAmX/2
Bon: https://regex101.com/r/LzrIBu/2
la source