2013-03-04 22 views
9

Sto cercando di trovare rapidamente tutti i file .java che contengono un termine ma manca un altro termine. Sto usando MyEclipse 10.7 e il suo 'Cerca | Funzione di ricerca file ', che supporta le espressioni regolari.regex per trovare file contenenti una parola ma non un'altra

L'espressione regolare funziona in questo scenario? Quale sarebbe la regex corretta?

TIA, Steve

risposta

12

L'unica soluzione che ho trovato al lavoro è la seguente espressione regolare:

^(?!.[\s\S]*MISSING_TERM).[\s\S]*INCLUDED_TERM.*$ 

Essa trova ogni file che include INCLUDED_TERM ma manca MISSING_TERM, indipendentemente dalla linea.

La chiave è \s\S, che garantisce la ricerca dell'intero file e non di ogni riga.

+0

funziona come un incantesimo. –

0

(?m)\A(?=.*REGEX_TO_FIND)(?!.*MISSING_REGEX.*).*\z

L'espressione regolare può ottenere un po 'complicato, ma si rompe in due pezzi.

  1. Trova il termine/frase/parola corrispondente. Questa parte non è troppo complicata in quanto è ciò che normalmente viene regex.
  2. Trovare il termine non presente. Questa è la parte difficile, ma è possibile.

Ho un esempio HERE che mostra come si desidera trovare la parola connectReadOnly nel testo, e non riescono a trovare disconnect. Poiché il testo contiene connectReadOnly, inizia a cercare il pezzo successivo, non trovando disconnect. Dal momento che disconnect è nel testo non riesce su tutta la stringa (ciò che è necessario per l'intero file corrispondente a). Se giochi con il secondo pezzo, la parte di negazione (?!.*disconnect.*), puoi impostarla come qualsiasi regex di cui hai bisogno. Nel mio esempio non voglio trovare disconnect in nessuna parte del mio codice :) Puoi facilmente sostituirlo con la tua parola da cercare, o anche una regex più complessa da "non trovare".

Il tasto è utilizzare la modalità multi linea, che viene impostata utilizzando l'inizio (?m) e quindi utilizzando l'inizio/la fine dei caratteri stringa. Utilizzando ^ e $ per iniziare/terminare una riga, dove \A e \z avviare e terminare una stringa, estendendo così la corrispondenza sull'intero file.

MODIFICA: per le domande connectReadOnly e disconnect: (?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z. L'esempio aggiornato può essere trovato here.

+0

Questo sembra vicino ma restituisce ancora un numero di falsi positivi (ad esempio file che contengono entrambi i termini). Ecco l'espressione che ho provato ma restituisce i file che contengono entrambi i termini: (? M)^(? =. * ConnectReadOnly) ((?! disconnect).) * $ Il mio obiettivo è trovare i file che hanno ' connectReadOnly 'su qualsiasi linea ma manca il termine' disconnect '. – Fred

+0

@SAL Le modifiche sono state apportate alla risposta, provale ... dovrebbe funzionare ora :) – Walls

+0

Anche questo non funziona. Mi chiedo se forse il parser regex in Eclipse è diverso da quello che stai usando? Quello che ho trovato funziona, dopo aver riunito i suggerimenti da varie fonti, è:^(?!. [\ S \ S] * disconnessione). [\ S \ S] * connect. * $ – Fred

0

Si potrebbe usare qualcosa come:

(?<!.*bar)foo(?!.*bar) 

Restituirà se "foo" viene trovato, ma "bar" non lo è.

Avviso: è necessario configurare il motore di ricerca di utilizzare multilinea regex (EX: Notepad ++ ha un'opzione chiamata "corrisponde a capo.") Perché di solito il punto rappresentare qualsiasi carattere ad eccezione interruzione di linea.

1

Se si desidera trovare su una singola linea, usare in questo modo:

^(?!.*MISSING_TERM).*INCLUDED_TERM.*$ 

È inoltre possibile utilizzare \ come carattere di escape, la causa potrebbe essere necessario piace class\.variable.

+0

In realtà, ho chiesto questo su una domanda separata ma sono stato downvoted come un fulmine. Ecco perché ho risposto a questa domanda. Credo che queste informazioni dovrebbero persistere sullo stackoverflow. Oltre a ciò, sono terribilmente affranto. – leventunver

+1

risposta molto bella (y). viva live broda. –

Problemi correlati