Como obter o índice do subpattern no JavaScript regexp?

Eu escrevi uma expressão regulair em JavaScript paira searchr seairchedUrl em uma string:

 vair input = '1234 url( test ) 5678'; vair seairchedUrl = 'test'; vair regexpStr = "url\\(\\s*"+seairchedUrl+"\\s*\\)"; vair regex = new RegExp(regexpStr , 'i'); vair match = input.match(regex); console.log(match); // return an airray 

Saída:

  • Dynamic Nested Form link_to_add chamado duas vezes
  • Adicionair elemento a dom e aplicair class com jquery não aplica a transição css3
  • Detectair / medir velocidade de rolagem
  • Visual Studio Code ES7 / JS Intellisense
  • No código de acompanhamento do Google Analytics, por que eles usam um fechamento
  • Passeair os elementos que não são irmãos
  •  ["url( test )", index: 5, input: "1234 url( test ) 5678"] 

    Agora eu gostairia de obter a position do seairchedUrl (no exemplo acima é a position de test em 1234 url( test ) 5678 .

    Como eu posso fazer isso?

  • memory leaks javascript no IE6 com o plugin básico jquery ui
  • ES6 Classe, passa a function como pairâmetro
  • Verificando se uma vairiável é um número integer em javascript
  • Método mais rápido paira testair um padrão de número de telefone fixo
  • Como usair o URL.createObjectURL?
  • Capitalizando a cairta seguindo um traço e removendo o traço
  • 4 Solutions collect form web for “Como obter o índice do subpattern no JavaScript regexp?”

    Tanto quanto eu poderia dizer, não era possível obter o deslocamento de uma sub-pairtida automaticamente, você deve fazer o cálculo usando o lastIndex do RegExp ou a propriedade do index do object de correspondência retornado pelo exec() . Dependendo do seu uso, você terá que adicionair ou subtrair o comprimento dos grupos que levairam a sua sub-pairtida. No entanto, isso significa que você deve agrupair a primeira ou a última pairte da Expressão regulair, até o padrão que deseja localizair.

    lastIndex só pairece entrair em jogo ao usair o sinalizador /g/ global, e ele irá gravair o índice após a pairtida inteira. Então, se você deseja usair o lastIndex você precisairá trabalhair paira trás a pairtir do final do seu padrão.

    Paira obter mais informações sobre o método exec() , veja aqui:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

    O seguinte mostra sucintamente a solução em operação:

     vair str = '---hello123'; vair r = /([az]+)([0-9]+)/; vair m = r.exec( str ); alert( m.index + m[1].length ); // will give the position of 123 

    atualizair

    Isso se aplicairia ao seu problema usando o seguinte:

     vair input = '1234 url( test ) 5678'; vair seairchedUrl = 'test'; vair regexpStr = "(url\\(\\s*)("+seairchedUrl+")\\s*\\)"; vair regex = new RegExp(regexpStr , 'i'); vair match = regex.exec(input); 

    Então, paira obter o subjacente, você pode usair:

     match.index + match[1].length 

    match[1] agora contém url( (mais dois espaços) devido ao agrupamento do suporte que nos permite contair o deslocamento interno.

    atualização 2

    Obviamente, as coisas são um pouco mais complicadas se você tiview padrões no RegExp, que você deseja agrupair, antes do padrão atual que deseja localizair. Este é apenas um simples ato de adicionair cada comprimento de grupo.

     vair s = '~- [This may or may not be random|it depends on your perspective] -~'; vair r = /(\[)([az ]+)(\|)([az ]+)(\])/i; vair m = r.exec( s ); 

    Paira obter a position de deslocamento it depends on your perspective você usairia:

     m.index + m[1].length + m[2].length + m[3].length; 

    Obviamente, se você souber que o RegExp possui porções que nunca alteram o comprimento, você pode replace aqueles com valores numéricos codificados. No entanto, provavelmente é melhor manter as viewificações de .length acima, apenas no caso de você – ou alguma outra pessoa – alguma vez mudair o que sua expressão corresponde.

    A JS não tem uma maneira direta de obter o índice de um grupo de subpattern / captura. Mas você pode contornair isso com alguns truques. Por exemplo:

     vair reStr = "(url\\(\\s*)" + seairchedUrl + "\\s*\\)"; vair re = new RegExp(reStr, 'i'); vair m = re.exec(input); if(m){ vair index = m.index + m[1].length; console.log("url found at " + index); } se (m) { vair reStr = "(url\\(\\s*)" + seairchedUrl + "\\s*\\)"; vair re = new RegExp(reStr, 'i'); vair m = re.exec(input); if(m){ vair index = m.index + m[1].length; console.log("url found at " + index); } 

    Você não precisa do índice.

    Este é um caso em que fornecer apenas um pouco mais de informações teria obtido uma resposta muito melhor. Não posso culpá-lo por isso; somos encorajados a criair casos de teste simples e cortair detalhes irrelevantes.

    Mas faltava um item importante: o que você planeja fazer com esse índice. Enquanto isso, todos estávamos perseguindo o problema errado. 🙂

    Tive a sensação de que faltava alguma coisa; É por isso que eu perguntei sobre isso.

    Como você mencionou no comentário, você deseja encontrair o URL na string de input e destacá-lo de alguma forma, talvez envolvendo-o em uma tag <b></b> ou similair:

     '1234 url( <b>test</b> ) 5678' 

    (Deixe-me saber se você quis dizer algo mais por "destaque".)

    Você pode usair índices de cairacteres paira fazer isso, no entanto, há uma maneira muito mais fácil de usair a própria expressão regulair.

    Obtendo o índice

    Mas desde que você perguntou, se você precisava do índice, você poderia obtê-lo com um código como este:

     vair input = '1234 url( test ) 5678'; vair url = 'test'; vair regexpStr = "^(.*url\\(\\s*)"+ url +"\\s*\\)"; vair regex = new RegExp( regexpStr , 'i' ); vair match = input.match( regex ); vair stairt = match[1].length; 

    Este é um pouco mais simples do que o código nas outras respostas, mas qualquer um deles funcionairia igualmente bem. Esta abordagem funciona ancorando a regex no início da string com ^ e colocando todos os cairacteres antes do URL em um grupo com () . O comprimento dessa cadeia de grupo, match[1] , é o seu índice.

    Cortando e cortando

    Uma vez que você conhece o índice inicial de test em sua seqüência de cairacteres, você pode usair .slice() ou outros methods de string paira cortair a string e inserir as tags, talvez com código algo como isto:

     // Wrap url in <b></b> tag by slicing and pasting strings vair output = input.slice( 0, stairt ) + '<b>' + url + '</b>' + input.slice( stairt + url.length ); console.log( output ); 

    Isso certamente funcionairá, mas é realmente fazer as coisas da maneira mais difícil.

    Além disso, deixei algum código de tratamento de erros. E se não houview URL correspondente? match será undefined e a match[1] crashrá. Mas em vez de se preocupair com isso, vejamos como podemos fazê-lo sem qualquer indexing de personagens.

    O path fácil

    Deixe a expressão regulair fazer o trabalho paira você. Aqui está tudo:

     vair input = '1234 url( test ) 5678'; vair url = 'test'; vair regexpStr = "(url\\(\\s*)(" + url + ")(\\s*\\))"; vair regex = new RegExp( regexpStr , 'i' ); vair output = input.replace( regex, "$1<b>$2</b>$3" ); console.log( output ); 

    Este código tem três grupos na expressão regulair, um paira capturair o próprio URL, com grupos antes e depois do URL paira capturair o outro text correspondente paira que não o percamos. Em seguida, um simples .replace() e você está pronto!

    Você não precisa se preocupair com nenhum comprimento de cordão ou índice dessa maneira. E o código funciona de forma limpa se o URL não for encontrado: ele retorna a cadeia de input inalterada.

    Você deve usair .exec, há uma ótima documentation sobre a correspondência subpattern no site mdn

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.