Trovare l'ultima corrispondenza (all'estrema destra) per un'espressione regolare arbitraria in rubino

StackOverflow https://stackoverflow.com/questions/814213

  •  03-07-2019
  •  | 
  •  

Domanda

Sto lavorando a un editor di testo in ruby ??e devo supportare un " Trova " funzionalità con schemi di espressione regolare forniti dall'utente. Ecco un semplice (familiare) caso d'uso:

  

Joe L'utente sta modificando un file di testo e ha posizionato il cursore da qualche parte nel mezzo del file. Vuole cercare indietro dalla posizione corrente del cursore per la sottostringa più vicina che corrisponda a un'espressione regolare arbitraria.

Sto pensando che questo problema equivale ad applicare il modello dell'utente all'intera stringa che precede la posizione del cursore nel file. Certo, potrei scorrere tutte le partite dall'inizio del file e utilizzare l'ultima corrispondenza, ma questo sembra dolorosamente inefficiente ... Sarebbe meglio cercare "da destra a sinistra", ma non ho trovato il modo di farlo con ruby ??Regexp. Potete aiutarmi?

È stato utile?

Soluzione

Usa il metodo rindex sulla tua stringa. In questo modo:

>> 'ssBssBss'.rindex(/B/)
=> 5

Altri suggerimenti

alla ricerca di . * (foo) dovrebbe anche individuare il foo più a destra, grazie alla natura avida di. * (ma il rindex può essere più veloce - ha bisogno di un microbench per verificare!).

Penso che il rindex sia la strada da percorrere. Sembra che il rindex esegua l'iterazione della stringa all'indietro. Scopri la riga 957 di string.c

Sembra che qualcuno abbia trovato un modo per invertire regolarmente espressioni in PERL nel 2001. Quindi invertireste una stringa e invertireste una regex ... quindi usate il metodo da sinistra a destra.

Sono sicuro che sia eccessivo ora e puoi andare con rindex

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top