Regexp: ¿Es posible buscar la cadena 'String' pero no 'String ({'
Pregunta
Estoy tratando de averiguar todas las ocurrencias de mi palabra concreta (llamada de método con API desactivada) en todos los archivos en un directorio. Necesito un regexp para encontrar todas las ocurrencias que no contengan llamadas actualizadas (nueva API). ¿Puedes ayudarme por favor?
Ejemplo:
- API desactivada: Método (A, B, C)
- Nueva API: Método ({A: A, B: B, C: C})
El RegExp debe encontrar todos los archivos que contienen 'método' pero no 'método ({'.
Gracias.
Solución
Yo diría que la forma correcta es usar el operador negativo de apariencia, ?!
/method(?!\(\{)/
Lo anterior dice: "Cualquier ocurrencia de method
eso es no seguido por ({
"
Cumple con sus requisitos mejor que los sugeridos /method([^{]/
Como este último no coincide con la cadena final (es decir, abc abc method
) y no maneja la combinación de dos caracteres ({
que solicitaste muy bien.
Otros consejos
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)
Para explicar: [ ]
Define una clase de caracteres, es decir, el personaje en esta posición puede coincidir con cualquier cosa dentro de la clase.
los ^
Como el primer carácter de la clase es una negación: significa que esta clase coincide con cualquier personaje excepto Los personajes definidos en esta clase.
los {
Por supuesto, es el único personaje que nos importa no coincidir en este caso.
Entonces, en algunos, esto coincidirá con cualquier cadena que tenga los caracteres method(
seguido de cualquier personaje excepto {
.
Hay otras formas en que podrías hacer esto en su lugar:
betelgeuse:tmp james$ grep "method(\w" test*
test1: method(a,b,c)
test3: method(a,b,c)
\w
en este caso es (suponiendo que la localidad C) sea equivalente a [0-9A-Za-z]
. Si desea permitir un espacio opcional, puede probar:
betelgeuse:tmp james$ grep "method([[:alnum:][:space:]]" test*
test1: method(a,b,c)
test3: method( a, b, c)
betelgeuse:tmp james$
(en sintaxis de GREP, [:alnum:] is the same as
W;
:espacio:refers to any whitespace character - this is represented as
S` En la mayoría de las implementaciones regex)
Puedes usar clases de personajes para excluir un siguiendo {
, p.ej
/method\([^{]/