2010-01-15 13 views
9

Powiedzmy mam następujący ciąg:Regex do pierwszego wystąpienia?

jest to test dla dobra testów. To tylko test. Koniec.

i chcę wybrać this is a test i this is only a test. Co na świecie muszę zrobić?

Poniższy Regex Próbowałem daje głupkowaty wynik:

this(.*)test (Chciałem też, aby uchwycić to, co było między nim)

powraca this is a test for the sake of testing. this is only a test

Wydaje się, że jest to prawdopodobnie coś proste I” m zapominając.

Odpowiedz

25

Regex jest chciwy, co oznacza, że ​​przechwytuje on tyle znaków, ile można, które pasują do dopasowania .*. Aby uczynić go non-chciwy try:

this(.*?)test

? modyfikator pozwoli uchwycić jak kilka znaków, jak to możliwe w meczu.

+0

Dzięki ... Tak myślałem. Przetestowałem to na testerze regex i działa. więc aplikacja (EditPlus), której używam, aby znaleźć i wymienić magię najwyraźniej nie rozpoznaje? kwantyfikator. –

+0

Jak na moją odpowiedź, możesz nie uzyskać doskonałych rezultatów, jeśli "to" i "test" są osadzone w innych słowach. Rozważ rozważenie tego, jeśli to może być problem. –

3

* to chciwy kwantyfikator. Oznacza to, że pasuje on tak bardzo jak to możliwe, tj. Co widzisz. W zależności od obsługi konkretnego języka dla wyrażenia regularnego, musisz znaleźć kwantyfikator bez chciwości. Zwykle jest to końcowy znak zapytania, taki jak ten: *?. Oznacza to, że przestanie konsumować litery, gdy tylko reszta regex zostanie spełniona.

There is a good explanation of greediness here.

8

Andy E i Ipsquiggle mieć dobry pomysł, ale chcę podkreślić, że warto dodać twierdzenie brzegowy słowo, co oznacza, że ​​nie chcemy mieć do czynienia ze słowami, które mają „to” lub "przetestować" w nich - tylko same słowa. W Perlu i podobnym, który jest zrobiony ze znacznikiem "\ b".

Tak jak jest, this(.*?)test pasowałoby do "osetów jest największych", których prawdopodobnie nie chcesz.

Wzór chcesz coś takiego: \bthis\b(.*?)\btest\b

+0

+1, zdecydowanie coś, o czym warto pomyśleć –

Powiązane problemy