2011-07-18 18 views
7

Próbuję dopasować wszystko wewnątrz podwójnych nawiasów klamrowych w ciągu znaków. Używam następujące wyrażenie:Jawne wyrażenie regularne pasujące do {{znaków wewnątrz podwójnego nawiasu klamrowego}}

\{\{.*\}\} 

kilka przykładów:

The {{dog}} is not a cat. to poprawnie meczy {{pies}}

Jednak
The {{dog}} is a {{cat}} dopasowuje wszystko po pierwszym meczu zamiast wrócić dwa mecze. Chcę, aby pasowało dwa razy, raz na {{pies}} i raz na {{cat}}

Czy ktoś wie, jak to zrobić?

Dzięki.

+1

Regex używa chciwego algorytmu (i dlatego chce pobrać tak duży ciąg, jaki będzie pasować). Czy to pomaga, czy potrzebujesz więcej? – rajah9

+0

To powinno działać \ {\ {. *? \} \} – DaMainBoss

+0

Jeśli otrzymałeś odpowiedź, zaakceptuj tę, która pomogła ci najbardziej – RMT

Odpowiedz

7

Chciwy .* pasuje niczego (z wyjątkiem przerw linii), więc gdy istnieją więcej niż jeden }} w ciągu, zawsze pasuje do ostatniego }} (jeśli nie ma żadnych \r i \n między dwoma }}!).

Postaraj się .* mecz niechętnie (ungreedy) tak:

\{\{.*?}} 

Zgadza się, nie trzeba uciekać się }.

Można również zrobić:

\{\{[^}]*}} 

jeśli {{ ... }} nie może zawierać pojedynczy } się.

1

Trzeba używać non-chciwy meczu:

\{\{.*?\}\} 

pasujące wszystko między szelkami, przeznaczenie:

\{\{(.*?)\}\} 
0

Co jest potrzebne jest „nie-chciwy” modyfikator - więc regex jest \{\{.+?\}\}

5

Spróbuj z \{\{.*?\}\}

wierzę, że to dlatego, że masz wzór jest chciwy.

Wikipedia wyjaśnia to całkiem dobrze.

Powiązane problemy