2009-05-15 18 views
16

Powiedzmy, że muszę dopasować wzór, jeśli pojawia się 3 lub 6 razy z rzędu. Najbliższe, co mogę uzyskać, to coś w rodzaju \ d {3,6}, ale to nie robi tego, czego potrzebuję.wyrażeń regularnych: dopasuj x razy LUB y razy

„123” powinien pasować
„123456” powinien pasować
„1234” nie powinien pasować

Odpowiedz

26
^(\d{3}|\d{6})$ 

Trzeba mieć jakiś terminator inaczej \d{3} dopasuje 1234. Dlatego kładę^i $ powyżej. Jedną z możliwości jest użycie lookarounds:

(?<!\d)(\d{3}|\d{6})(?!\d) 

aby upewnić się, że nie jest poprzedzona lub po której następuje cyfra (w tym przypadku). Więcej w Lookahead and Lookbehind Zero-Width Assertions.

+0

To wygląda dobrze, dzięki. Ale co jeśli wzór jest znacznie większy niż po prostu \ d? Sądzę, że przy konstruowaniu wyrażenia regularnego mógłbym wprowadzić interpolację łańcuchową, ale czy istnieje lepszy sposób na ponowne wykorzystanie wzorców podrzędnych? –

+0

W takim przypadku należy użyć formatu {1,2}, tj. (() {3}) {1,2} –

5

Jak o:

(\d\d\d){1,2} 

chociaż musisz również osłony na obu końcach, które zależą od silnika RE, coś jak:

[^\d](\d\d\d){1,2}[^\d] 

czyli

^(\d\d\d){1,2}$ 
1

Pierwszy dopasowuje 3, 6, ale także 9, 12, 15, ... Drugi wygląda dobrze. Oto jeszcze jeden zwrot:

\d{3}\d{3}? 
+6

Po pierwsze i drugie co? Jeśli odnosisz się do czyjejś odpowiedzi, powinieneś powiedzieć, która ona jest. Odpowiedzi te nie zawsze pojawiają się w tej samej kolejności. –

Powiązane problemy