2012-08-29 14 views
8

Mam Regular Expression /'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
i mój kod testowy ('He said, "You're cool."' , 'Rawr')
(Mój kod testowy symuluje parametry są przekazywane do funkcji.)

opiszę moje wyrażenia regularnego jak rozumiem i mam nadzieję, że niektóre z was mogę rzucić trochę światła na mój problem.

1) /' znaczy na początku dopasowanej ciąg, nie musi być '

2) (.*) środki przechwycić dowolny znak z wyjątkiem \n 0 lub więcej razy

3) (?:(?:4)|(?:5)) środki nie oddają, ale starają się zrobić krok 4, a jeśli to nie działa krok try 5

4) (?:'\s*,\s*) środki nie uchwycić, ale nie musi być ' z 0 lub więcej białych znaków następnie przez , 0 lub więcej znaków białych

5) (?:'\)) środki nie uchwycić, ale nie musi być ')

Więc wydaje się, że powinien wrócić w tym (i to jest to, co chcę):
' + He said, "You're cool." + ' ,
ale zwraca:
' + He said, "You're cool."' , 'Rawr + ')

Jeśli zmienię mojego kodu testowego do ('He said, "You're cool."' , 'Rawr' (bez końca nawiasach) powraca to, co chcę, ale jak tylko dodam, że ostatni nawias, to wydaje się, że moja lub operator robi co chce. Chcę, aby najpierw przetestował przecinkiem, a tam, gdzie jest, przeciąć, a jeśli nie ma jednego sprawdzianu na nawias.
Próbowałem przełączać plamy z kroku 4 i 5, ale nadal operator OR wydaje się zawsze domyślnie strona (?:'\)). Jak mogę dopasować najkrótszą możliwą kwotę?RegExp - Jak mogę dopasować najkrótszą możliwą kwotę?

+0

Początek ciągu znaków to '/ ^', a nie '/', fwiw. Osobiście nie jestem przekonany, czy użyłbym wyrażenia regularnego do tego, co próbujesz zrobić, ale raczej do małego parsera. Mylące wyrażenie regularne jest mylące. –

+0

@DaveNewton - Tak, wiem to. Dlatego powiedziałem na początku dopasowanego napisu. Może powinienem był powiedzieć na początku dopasowanej części struny. Lub kiedy zaczyna się mecz, musi rozpoczynać się od '' '. – Aust

Odpowiedz

15

Nie sądzę, że Twoim problemem jest operator OR, ale greediness z .*. Będzie pasować do całego ciągu znaków, a następnie wstecz -track, dopóki nie zostaną spełnione poniższe wyrażenia. Pierwszy mecz w tym procesie wycofywania będzie 'He said, "You're cool."' , 'Rawr + '). Zamiast tego spróbuj .*?!

+1

Bergi jesteś geniuszem! To działa idealnie. :) Czy zastanawiasz się trochę, dlaczego tak działa? Nieważne, zrozumiałem z twojego linku. Dzięki jeszcze raz. :) – Aust

+0

Możesz chcieć przeczytać http://stackoverflow.com/a/5319978/1048572 – Bergi