Encontrar la última coincidencia (más a la derecha) para una expresión regular arbitraria en ruby

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un editor de texto en ruby, y necesito admitir un " Buscar " característica con patrones de expresión regular proporcionados por el usuario. Aquí hay un caso de uso simple (familiar):

  

Joe User está editando un archivo de texto y ha colocado el cursor en algún lugar en el medio del archivo. Quiere buscar hacia atrás desde la ubicación actual del cursor para la subcadena más cercana que coincida con una expresión regular arbitraria.

Estoy pensando que este problema equivale a aplicar el patrón del usuario a toda la cadena que precede a la ubicación del cursor en el archivo. Claro, podría recorrer todas las coincidencias desde el principio del archivo y usar la última coincidencia, pero esto parece dolorosamente ineficiente ... Sería mejor buscar "de derecha a izquierda". pero no he encontrado una manera de hacerlo con ruby ??Regexp. ¿Puedes ayudarme?

¿Fue útil?

Solución

Use el método rindex en su cadena. Así:

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

Otros consejos

buscando . * (foo) también debe ubicar al foo más a la derecha, gracias a la naturaleza codiciosa de. * (pero rindex puede ser más rápido, ¡necesita un microbenchmark para verificar!).

Creo que rindex es el camino a seguir. Parece que rindex realmente iterará a través de la cadena hacia atrás. Consulte la línea 957 de string.c

Parece que alguien descubrió una manera de revertir regularmente expresiones en PERL en 2001. Entonces invertirías una cadena e invertirías una expresión regular ... luego usarías el método de izquierda a derecha.

Estoy seguro de que es exagerado ahora y puedes ir con rindex

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top