Ci stai pensando nel modo giusto. Ma sfortunatamente le guardie di solito sono di lunghezza fissa. L'unica grande eccezione è il motore regex di .NET, che consente di quantificare la ripetizione all'interno di lookbehind. Ma dal momento che hai solo bisogno di un lookback negativo e non di un lookahead anche tu. C'è un trucco per te. Invertire la stringa, quindi cercare di far corrispondere:
/rab(?!.{0,10}oof)/
poi invertire il risultato della partita o sottrarre la posizione corrispondente dalla lunghezza della stringa, se è quello che siete dopo.
Ora dalla regex che hai dato, suppongo che questa fosse solo una versione semplificata di ciò che effettivamente ti serve. Naturalmente, se lo bar
è un modello complesso, è necessario riflettere su come reinserirlo correttamente.
Nota che se il tuo schema richiede sia longheroni di aspetto variabile che lookahead, sarebbe più difficile risolverli. Inoltre, nel tuo caso, sarebbe possibile per decostruire il tuo lookbehind in più quelle di lunghezza variabile (perché si utilizzano né +
né *
):
/(?<!foo)(?<!foo.)(?<!foo.{2})(?<!foo.{3})(?<!foo.{4})(?<!foo.{5})(?<!foo.{6})(?<!foo.{7})(?<!foo.{8})(?<!foo.{9})(?<!foo.{10})bar/
Ma non è tutto ciò che bello, vero?
fonte
2012-11-30 19:23:35
Invertire la stringa è stata un'idea interessante. Grazie! –