2013-03-04 8 views

Odpowiedz

12

Jedynym rozwiązaniem mogę znaleźć do pracy jest następujące Regex:

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

Okazuje każdy plik, który zawiera INCLUDED_TERM ale brakuje MISSING_TERM, niezależnie od linii.

Kluczem jest \s\S, który zapewnia przeszukiwanie całego pliku, a nie każdego wiersza.

+0

działa jak czar. –

0

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

regex może dostać trochę trudne, ale to rozpada się na dwie części.

  1. Znajdź pasujący termin/wyrażenie/słowo. Ta część nie jest zbyt trudna, ponieważ na to zwykle wygląda regex.
  2. Określenie terminu nie występuje. To trudna część, ale jest to możliwe.

Mam przykład HERE który pokazuje w jaki sposób chcesz znaleźć słowo connectReadOnly w tekście, a nie mogą znaleźć disconnect. Ponieważ tekst zawiera connectReadOnly, zaczyna szukać następnego elementu, nie znajdując disconnect. Od disconnect jest w tekście nie powiedzie się na cały ciąg (, co będzie potrzebne, aby cały plik pasował do). Jeśli bawisz się drugim utworem, częścią z negacją (?!.*disconnect.*), możesz ustawić to jako regex, którego potrzebujesz. W moim przykładzie nie chcę znaleźć disconnect w dowolnym miejscu w moim kodzie :) Można go łatwo zastąpić słowem do wyszukiwania, lub nawet bardziej złożonym wyrażeniem regularnym "nie znaleźć".

Kluczem jest użycie trybu wielowierszowego, który jest ustawiony na początku (?m), a następnie za pomocą początku/końca znaków ciąg. Używanie ^ i $ do rozpoczynania/kończenia linii, w której \A i rozpoczyna się i kończy łańcuch, rozszerzając w ten sposób dopasowanie na cały plik.

EDYCJA: W przypadku użycia pytania i disconnect: (?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z. Zaktualizowany przykład można znaleźć here.

+0

Wydaje się być blisko, ale nadal zwraca wiele fałszywych alarmów (np. Plików zawierających oba terminy). Oto wyrażenie, które próbowałem, ale zwraca pliki, które zawierają oba terminy: (? M)^(? =. * ConnectReadOnly) ((?! rozłącz)) * Moim celem jest znalezienie plików, które mają " connectReadOnly "w dowolnej linii, ale brakuje terminu" rozłącz ". – Fred

+0

@SAL Zmiany zostały wprowadzone w odpowiedzi, wypróbuj je ... teraz powinno działać :) – Walls

+0

To też nie działa. Zastanawiam się, czy parser regex w Eclipse może być inny niż ten, którego używasz? Co znalazłem działa, po zestawieniu wskazówek z różnych źródeł:^(?!. [\ S \ S] * rozłącz). [\ S \ S] * connect. * $ – Fred

0

Można użyć coś takiego:

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

będzie pasował jeśli "foo" występuje jednak "bar" nie jest.

Uwaga: musisz skonfigurować swoją wyszukiwarkę do korzystania z wyrażeń regularnych (EX: Notepad ++ ma opcję o nazwie ". Matches newline"), ponieważ zwykle kropka reprezentuje dowolny znak , z wyjątkiem podziału linii.

1

Jeśli chcesz go znaleźć w jednej linii, użyj go tak:

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

Można również użyć \ jako znak ucieczki, bo może trzeba go jak class\.variable.

+0

Właściwie to poprosiłem o to na osobne pytanie, ale zostałem odrzucony jak błyskawica. Właśnie dlatego odpowiedziałem na to pytanie. Wierzę, że ta informacja powinna trwać na stackoverflow. Poza tym jestem strasznie zrozpaczony. – leventunver

+1

bardzo ładna odpowiedź (y). viva live broda. –

Powiązane problemy