Regexp: est-il possible de rechercher chaîne 'string', mais pas 'string ({'

StackOverflow https://stackoverflow.com/questions/2040923

  •  19-09-2019
  •  | 
  •  

Question

Je suis en train de trouver toutes les occurences de ma parole en béton (appel de méthode avec l'API désapprouvée) dans tous les fichiers dans un répertoire. Je besoin d'un regexp pour trouver toutes les occurences qui ne contiennent pas appel mis à jour (nouvelle API). Pouvez-vous me aider s'il vous plaît?

Exemple:

  • api Obsolète: Procédé (a, b, c)
  • nouvelle api: méthode ({a: a, b: b, c: c})

L'expression rationnelle doit trouver tous les fichiers contenant « méthode » mais pas « méthode ({ ».

Merci.

Était-ce utile?

La solution

Je dirais que la bonne façon est d'utiliser l'opérateur d'anticipation négative, ?!

/method(?!\(\{)/

Les états ci-dessus, "toute occurence de method qui est pas suivi par ({"

Il répond à vos besoins mieux que le /method([^{]/ suggéré que celle-ci ne correspond pas à la fin de chaîne (à savoir abc abc method) et il ne gère pas la combinaison de deux caractères ({ que vous avez demandé très bien.

Autres conseils

betelgeuse:tmp james$ echo " method(a,b,c) "> test1
betelgeuse:tmp james$ echo " method(a,b,c) " > test3
betelgeuse:tmp james$ echo " method({a:a, b:b, c:c})" > test2
betelgeuse:tmp james$ grep "method([^{]" test*
test1: method(a,b,c) 
test3: method(a,b,c) 

Pour expliquer:. [ ] définit une classe de caractères - à savoir, le caractère dans cette position peut correspondre à rien à l'intérieur de la classe

Le ^ comme premier caractère de la classe est une négation. Cela signifie que cette classe correspond à tout caractère sauf les caractères définis dans cette classe

Le { bien sûr est le seul caractère que nous prenons soin de ne pas correspondre dans ce cas.

Ainsi, dans certains, cela correspondra à une chaîne qui a les caractères method( suivi d'un caractère sauf {.

Il y a d'autres façons que vous pourriez faire ceci:

betelgeuse:tmp james$ grep "method(\w" test*
test1: method(a,b,c) 
test3: method(a,b,c)

\w dans ce cas (en supposant que les paramètres régionaux C) équivalente à [0-9A-Za-z]. Si vous souhaitez autoriser un espace en option, vous pouvez essayer:

betelgeuse:tmp james$ grep "method([[:alnum:][:space:]]" test*
test1: method(a,b,c) 
test3: method( a, b, c) 
betelgeuse:tmp james$ 

(dans la syntaxe grep, [:alnum:] is the same as \ w; [: space:] refers to any whitespace character - this is represented as \ s` dans la plupart des mises en œuvre regex)

Vous pouvez utiliser des classes de caractère pour exclure suivant {, par exemple

/method\([^{]/
scroll top