2012-01-12 23 views
6

Próbuję znaleźć sposób, aby usunąć cały tekst w ciągu przed meczem w Regex. Koduję to w C#.Regex + Usuń cały tekst przed meczem

Na przykład, jeśli ciąg znaków to "cześć, dopasowanie testowe", a wzorzec to "test", chciałbym, aby końcowym wynikiem było "dopasowanie testowe" (tj. Usunąć wszystko przed testem).

Jakieś myśli? Dzięki!

EDYCJA: Prawdopodobnie powinienem być nieco bardziej konkretny w moim przykładzie po przeczytaniu twoich odpowiedzi (i dzięki za nie). Podoba mi się metoda z wyprzedzeniem, ale uprościliśmy mój przykład. Żeby było trudniej, zazwyczaj łańcuchy wyglądać następująco:

„cześć, dopasowanie test test everythingAfter”

Więc jeśli mogę użyć wzorca „test”, to złapie pierwszego. Moim celem jest zastąpienie całego tekstu po drugim dopasowaniu. Tzn .: wynik "testuj wszystko po" ... Przepraszam za to.

+2

nie jestem wystarczająco zaznajomieni z C#, aby napisać kod. Jednak nie używaj RegEx, używaj podstawowych metod łańcuchowych. * szukaj *, aby znaleźć wystąpienie, niż użyj * podłańcuch * przechwytywanie * wszystko po *. –

+0

W przypadku wzorców, które próbujesz usunąć, czy są one zawsze ciągami znaków, czy też czasami są rzeczywistymi wyrażeniami regularnymi? Jeśli pierwsza, użyj "IndexOf" i "Substring" i unikaj kar, których nie potrzebujesz. –

+0

Prawdopodobny duplikat: [Usuń tekst z ciągu, aż osiągnie określoną postać] (http://stackoverflow.com/q/8371922/299327) –

Odpowiedz

0

* Aktualizacja za pomocą MatchCollection

string test = "hello, test matching"; 

string regexStrTest; 
regexStrTest = @"test\s\w+";  
MatchCollection m1 = Regex.Matches(test, regexStrTest); 
//gets the second matched value 
string value = m1[1].Value; 
+0

patrz edytuj (i komentuj) powyżej – keynesiancross

+0

To jest * lookbehind *, a nie wcześniejsza, i nie robi nic użytecznego. Jeśli '" test \ s "' właśnie zużył 'test', po którym następuje spacja, to oczywiście funkcja lookbehind dla' "testu" 'zakończy się pomyślnie. Ponadto opcja 'Singleline' nie ma żadnego efektu, ponieważ metaznak' .' nie jest używany w wyrażeniu regularnym. –

+0

Zaktualizowano! Rozwiązanie rozwiązuje pytanie. – Standage

5

Dla prostego rozwiązania, wystarczy wymienić "start-of-line coś test" z "test":

newString = Regex.Replace(oldString, "^.*test", "test"); 

Od * jest chciwy, to zastąpi w jak największym stopniu, tj a test b test c stanie się test c. Aby wymienić tak mało, jak to możliwe, użyj *? zamiast *.

Jeśli chcesz uniknąć powielania szukane słowo, można użyć Zero-width positive lookahead assertion:

newString = Regex.Replace(oldString, "^.*(?=test)", ""); 
+0

Spowoduje to usunięcie wszystkiego przed * ostatnim * dopasowaniem 'testu'. W wielu przypadkach może to nie mieć znaczenia, ale może też być mylące. – svick

+0

Właściwie, kiedy odczytywam teraz odpowiedzi, właśnie to muszę zrobić (zobacz moją edycję powyżej). Potrzebuję go, aby dopasować się do ostatniego wyniku i zastąpić wszystko przed nim. Wielkie dzięki. – keynesiancross

+0

@keynesiancross: Jeśli tak jest, powinieneś przyjąć tę odpowiedź lub tę od Heinzi, * nie * Paul's. Nic osobistego, Paul, ale ten działa tylko przez przypadek. –

7

Można użyć positive lookahead dopasować ciąg ale nie uchwycić go:

(?=test) 

Więc chcesz Aby przechwycić materiał przed ostatnim wystąpieniem testu:

^.*(?=test) 

Jeśli chcesz, aby tak było, że jest to pierwsze wystąpienie testu użyć leniwy dopasowanie:

^.*?(?=test) 
+0

Thx za odpowiedź - dokonałem edycji problemu powyżej ... Podoba mi się jednak podejście wyprzedzające. Czy mogę wybrać drugi mecz, a następnie patrzeć w przyszłość? – keynesiancross

+0

jak można uchwycić wszystko po wystąpieniu? – user1040975

Powiązane problemy