2010-08-25 14 views
22

Tengo un documento del que necesito extraer algunos datos. El documento contiene cadenas como éstasAspecto positivo en la expresión regular de JavaScript

Text:"How secure is my information?" 

necesito para extraer el texto que está en comillas dobles después de que el literal Text:

How secure is my information? 

¿Cómo se hace esto con expresiones regulares en Javascript

+9

eso no es de búsqueda hacia atrás (o incluso de búsqueda hacia delante). –

+0

¿Cómo sería la expresión regular con lookbehind? – inetphantom

+0

@MattBall, ¿cómo te imaginas? Uno podría coincidir en uno o más personajes con un lookbehind para 'Text:' 'y un lookahead para' "'. – henrebotha

Respuesta

40

JavaScript hacen expresiones regulares no es compatible con lookbehinds. Usted tiene que utilizar la captura de paréntesis en su lugar:

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

alert(str.match(reg)[1]); 
// -> How secure is my information? 
+2

¿Pero cómo extraigo todos esos datos de un documento grande? Digan en una matriz o algo así? – Raj

+0

Usas el modificador/g como lo que tenía en mi Respuesta: –

+0

@Raj: puedes usar el modificador '/ g', como dijo Crayon Violent. Este es el modificador global, sin él la expresión regular detendrá la ejecución cuando encuentre la primera coincidencia, con ella la expresión regular continuará hasta que encuentra todas las coincidencias, devolviendo una matriz con todas las coincidencias. –

2
string.match(/Text:"([^"]*)"/g) 
+1

Cómo evitar la coincidencia de texto: en el resultado? – Raj

+1

cadena [0] siempre tendrá la coincidencia de expresiones regulares completa. cadena [1] tendrá el texto capturado .Si hubiera una segunda captura (paréntesis) en la expresión regular, se pondría en la cadena [2], etc ... –

+0

Creo que con/g flag solo obtendrá la coincidencia total de expresiones regulares para todas las coincidencias. – Raj

11

Sólo puede hacer:

/Text:"(.*?)"/ 

Explicación:

  • Text:": Para ser igualado literalmente
  • .*?: Para emparejar cualquier cosa en no expansivo manera
  • (): Para capturar el partido
  • ": Para que coincida con un literal "
  • / /: delimitadores
+0

¿Cómo se usa esto? ¿Tienes algún contexto? – Sjoerd

+0

que es la expresión regular, se supone que debes usarla con, por ejemplo, .match() –

2
<script type="text/javascript"> 
var str = 'Text:"How secure is my information?"'; 
var obj = eval('({'+str+'})') 
console.log(obj.Text); 
</script> 
+5

Los navegadores modernos también tienen [JSON.parse] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/ parse), que puede preferirse a 'eval'. – Sjoerd

14

sólo quiero añadir algo: JavaScript doesn' t support lookbehinds como (?<=) o (?<!).

Pero es hace compatible con lookaheads como (?=) o (?!).

2

Si se quiere evitar la expresión regular todos juntos se puede hacer:

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

Aquí es un ejemplo que muestra cómo se puede abordar esto.

1) Habida cuenta de esta cadena de entrada:

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) extraer datos en comillas dobles después de la literal Text: para que los resultados es una matriz con todos los partidos, así:

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

SOLUCIÓN

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

console.log(JSON.stringify( getText(inputText) )); 

RUN SNIPPET para ver un DEMO DE TRABAJO

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) ));

Cuestiones relacionadas