Olhar positivo para trás na expressão regular JavaScript

Eu tenho um documento do qual preciso extrair alguns dados. Documento contém strings como estas

Text:"How secure is my information?" 

Eu preciso extrair o texto que está entre aspas após o Text: literal Text:

 How secure is my information? 

Como faço isso com regex em JavaScript

As asserções lookbehind foram finalizadas recentemente para o JavaScript e estarão na próxima publicação da especificação ECMA-262. Eles são suportados no Chrome 66 (Opera 53), mas não há outros grandes navegadores no momento da escrita.

 var str = 'Text:"How secure is my information?"', reg = /(?< =Text:")[^"]+(?=")/; str.match(reg)[0]; // -> How secure is my information? 

Os navegadores mais antigos não suportam lookbehind na expressão regular JavaScript. Você tem que usar parênteses de captura para expressões como esta em vez disso:

 var str = 'Text:"How secure is my information?"', reg = /Text:"([^"]+)"/; str.match(reg)[1]; // -> How secure is my information? 

Isso não cobrirá todos os casos de uso de asserção lookbehind, no entanto.

Eu só quero adicionar algo: JavaScript não suporta lookbehinds como (?< = ) Ou (?< ! ) .

Mas suporta lookaheads como (?= ) Ou (?! ) .

Você pode apenas fazer:

 /Text:"(.*?)"/ 

Explicação:

  • Text:" : Para ser correspondido literalmente
  • .*? : Para combinar com qualquer coisa de maneira não-gananciosa
  • () : Para capturar o jogo
  • " : Para corresponder a um literal "
  • / / : delimitadores
 string.match(/Text:"([^"]*)"/g) 
  

Se você quiser evitar a expressão regular, tudo junto você pode fazer:

 var texts = file.split('Text:"').slice(1).map(function (text) { return text.slice(0, text.lastIndexOf('"')); }); 

Aqui está um exemplo mostrando como você pode abordar isso.

1) Dada esta string de input:

 const inputText = `Text:"How secure is my information?"someRandomTextHere Voice:"Not very much" Text:"How to improve this?" Voice:"Don't use '123456' for your password" Text:"OK just like in the "Hackers" movie."`; 

2) Extraia os dados entre aspas duplas após o Text: literal Text: para que os resultados sejam uma matriz com todas as correspondências assim:

 ["How secure is my information?", "How to improve this?", "OK just like in the \"Hackers\" movie."] 

SOLUÇÃO

 function getText(text) { return text .match(/Text:".*"/g) .map(item => item.match(/^Text:"(.*)"/)[1]); } console.log(JSON.stringify( getText(inputText) )); 

EXECUTAR SNIPPET PARA VER UMA DEMONSTRAÇÃO DE TRABALHO

 const inputText = `Text:"How secure is my information?"someRandomTextHere Voice:"Not very much" Text:"How to improve this?" Voice:"Don't use '123456' for your password" Text:"OK just like in the "Hackers" movie."`; function getText(text) { return text .match(/Text:".*"/g) .map(item => item.match(/^Text:"(.*)"/)[1]); } console.log(JSON.stringify( getText(inputText) ));