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ę?
8
A
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 .*?
!
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. –
@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