2016-02-17 21 views
5

ho la seguente stringaPCRE espressioni regolari sovrapposte partite

001110000100001100001 

e questa espressione

/[1]....[1]/g 

questo rende due partite

matches

ma voglio che corrisponde anche il modello tra quelli che hanno entrambi, per così dire, il sovrapposto 1

Non ho assolutamente idea, come può funzionare? invece di 0 può essere qualsiasi carattere

+0

'/ (modello) (. *?) \ 1 /' Utilizzare questo e ottenere il secondo valore di gruppo acquisito. Non c'è bisogno di guardare dietro. – Tushar

+0

Se hai bisogno di corrispondenze complete, prova [(?:.? (? <= 1) .... 1) +] (https://regex101.com/r/rNuu2/1) –

risposta

5

Un trucco comune è usare la tecnica di cattura all'interno di un lookahead positivo non controllato. Utilizzare questa regex con preg_match_all:

(?=(1....1)) 

Vedi regex demo

Il values are in $matches[1]:

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); 

Vedi lookahead reference:

Lookaround in realtà corrisponde ai caratteri, ma poi abbandona la partita, restituendo solo il risultato: match o no mat ch. Questo è il motivo per cui sono chiamate "asserzioni". Non consumano caratteri nella stringa, ma affermano solo se una partita è possibile o meno.

Se si desidera memorizzare il match della regex all'interno di un lookahead, è necessario put catturare parentesi che racchiudono l'espressione regolare all'interno del lookahead, come questo: (?=(regex)).

+1

grazie mille, io Ho già giocato in giro con lookahead positivo ma non ho fatto bene, questo funziona perfettamente e ben spiegato –