Partite sovrapposte in Regex

Non riesco a trovare una risposta a questo problema e mi chiedo se ne esiste uno. Esempio semplificato:

Considera una stringa “nnnn”, dove voglio trovare tutte le corrispondenze di “nn”, ma anche quelle che si sovrappongono l’una con l’altra. Quindi la regex fornirebbe le seguenti 3 corrispondenze:

  1. nn nn
  2. n nn n
  3. nn nn

Mi rendo conto che questo non è esattamente ciò che le regex sono pensate, ma camminare la stringa e analizzarle manualmente sembra un sacco di codice, considerando che in realtà le partite dovrebbero essere fatte usando un pattern, non una stringa letterale.

    Una ansible soluzione potrebbe essere quella di utilizzare un aspetto positivo dietro :

    (?< =n)n 

    Ti darebbe la posizione finale di:

    1. * N *** ** n nn
    2. n * n *** n ** n
    3. nn * n *** ** n

    Come menzionato da Timothy Khouri , un lookahead positivo è più intuitivo

    Preferirei la sua proposizione (?=nn)n la forma più semplice:

     (n)(?=(n)) 

    Ciò farebbe riferimento alla prima posizione delle stringhe desiderate e catturerebbe la seconda n nel gruppo (2) .

    Questo perché:

    • Qualsiasi espressione regolare valida può essere utilizzata all'interno del lookahead.
    • Se contiene parentesi di cattura, le backriver verranno salvate .

    Quindi il gruppo (1) e il gruppo (2) cattureranno qualunque rappresentazione 'n' (anche se si tratta di una regex complicata).

    Usare un lookahead con un gruppo di cattura funziona, a scapito di rendere la tua espressione regolare più lenta e complicata. Una soluzione alternativa è quella di dire al metodo Regex.Match () dove dovrebbe iniziare il prossimo tentativo di corrispondenza. Prova questo:

     Regex regexObj = new Regex("nn"); Match matchObj = regexObj.Match(subjectString); while (matchObj.Success) { matchObj = regexObj.Match(subjectString, matchObj.Index + 1); } 

    AFAIK, non esiste un puro modo regex per farlo in una volta (cioè restituendo le tre acquisizioni richieste senza loop).

    Ora, è ansible trovare un modello una volta e eseguire il ciclo sulla ricerca iniziando con l’offset (posizione trovata + 1). Dovrebbe combinare l’espressione regolare con un codice semplice.

    [EDIT] Grande, sono downvoted quando ho praticamente detto quello che Jan ha mostrato …
    [EDIT 2] Per essere chiari: la risposta di Jan è migliore. Non più preciso, ma sicuramente più dettagliato, merita di essere scelto. Semplicemente non capisco perché il mio è downvoted, dal momento che non vedo ancora nulla di errato. Non è un grosso problema, solo fastidioso.