JavaScript tiene dos métodos útiles, ambos casi hacen lo que necesito.
String.prototype.indexOf() buscará una subcadena y devolverá su posición. Tiene un parámetro de position opcional que es el punto de inicio de la búsqueda, por lo que puede encontrar fácilmente el siguiente.String.prototype.search() buscará una cadena usando una expresión regular y devolverá su posición. Sin embargo, que yo sepa, no permite una posición inicial, por lo que siempre busca desde el principio.¿Hay algo que me permita encontrar la posición usando una expresión regular que permita una posición inicial?
Podrías hacer un String#slice por adelantado para deshacerte de las partes no deseadas y luego tomar String#search .
function search(string, regexp, from = 0) { const index = string.slice(from).search(regexp); return index === -1 ? -1 : index + from; }Para obtener la posición de la posición original del resultado de la búsqueda, puede usar el enfoque de Nina Scholz y luego volver a agregar los caracteres eliminados desde el principio. Por ejemplo:
const str = "Hello World!"; let start = 5; const output = str.substring(start).search(/World/g) + start; console.log(output); //6 Nota: tenga cuidado con los casos en los que .search() devuelve -1 .
La otra respuesta es el camino a seguir, ya que es mucho más claro cuál es la intención, pero si tuviera que usar una expresión regular, podría hacerlo así:
// This string should not include characters that have special // meaning in regular expressions / should be escaped. const inputString = "foo bar baz bar"; const offset = 8; const searchString = "bar"; inputString.search(new RegExp(`(?=.{${offset}}${searchString}`)); // (?= make sure ${searchString} ("bar") // is preceded by: // . anything // {$(a number)} at least this many times: // {8} in this example. // The (?=A)B positive lookahead won't be included in the result, // so you don't need to plus or minus the offset from the result: // Example: const str = 'aabbcc aabbcc aabbcc'; ^ ^ ^ 2 9 16 str.search(new RegExp(`(?<=.{${0}})bb`)); // Return 2 str.search(new RegExp(`(?<=.{${4}})bb`)); // Returns 9 str.search(new RegExp(`(?<=.{${10}})bb`)); // Returns 16 str.search(new RegExp(`(?<=.{${1000}})bb`)); // Returns -1 str.search(new RegExp(`(?<=.{${10}})doesntexist`)); // Returns -1