2010-08-25 7 views
22

Ich habe ein Dokument, aus dem ich einige Daten zu extrahieren. Dokument enthalten Zeichenketten wie diesePositive hinter in JavaScript-Ausdruck regelmäßig aussieht

Text:"How secure is my information?" 

Ich brauche Text zu extrahieren, die nach dem wörtlichen Text: in doppelten Anführungszeichen ist

How secure is my information? 

Wie kann ich tun dies mit Regex in Javascript

+9

zu sehen, die nicht Lookbehind (oder sogar Look-Ahead). –

+0

Wie sieht der Regex mit Lookbehind aus? – inetphantom

+0

@MattBall, wie findest du das? Man könnte ein oder mehrere Zeichen mit einem Lookbehind für 'Text:' 'und einem Lookahead für' "' abgleichen. – henrebotha

Antwort

40

JavaScript reguläre Ausdrücke tun unterstützt keine Lookbehinds. Sie haben zu verwenden Klammer Erfassung statt:

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

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

Aber wie extrahiere ich alle diese Daten aus einem großen Dokument? Sagen Sie in ein Array oder etwas? – Raj

+0

Sie verwenden den/g Modifikator wie das, was ich in meinem hatte Antwort: –

+0

@Raj: Sie können den Modifikator '/ g' verwenden, wie Crayon Violent sagte.Dies ist der globale Modifikator, ohne ihn stoppt der reguläre Ausdruck die Ausführung, wenn er die erste Übereinstimmung findet, mit ihr wird der reguläre Ausdruck fortgesetzt findet alle Übereinstimmungen und gibt ein Array mit allen Übereinstimmungen zurück –

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

Wie zu vermeiden, Text: im Ergebnis? – Raj

+1

Zeichenfolge [0] wird immer die vollständige Regex übereinstimmen. Zeichenfolge [1] wird den erfassten Text haben .Wenn es eine zweite Aufnahme (Klammer) in der Regex gäbe, würde sie in String [2], etc ... gesetzt werden. –

+0

Ich denke, mit/g Flag erhalten Sie nur volle Regex-Übereinstimmung für alle Übereinstimmungen. – Raj

11

Sie können nur tun:

/Text:"(.*?)"/ 

Erläuterung:

  • Text:": Um buchstäblich
  • .*? angepasst werden: Zum passen Sie alles in nicht gierige Weise
  • (): das Spiel erfassen
  • ": Trennzeichen
+0

Wie verwenden Sie das? Hast du einen Kontext? – Sjoerd

+0

das ist die Regex, Sie sollten es verwenden mit zum Beispiel .match() –

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

Moderne Browser haben auch [JSON.parse] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/ parse), was gegenüber "eval" bevorzugt sein kann. – Sjoerd

14

Ich möchte nur etwas hinzufügen: eine wörtliche "

  • / / Passend JavaScript doesn‘ t Unterstützung Lookbehinds wie (?<=) oder (?<!).

    Aber es tut Unterstützung Lookaheads wie (?=) oder (?!).

  • 2

    Wenn Sie den regulären Ausdruck zu vermeiden, wollen alle zusammen können Sie tun:

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

    Hier ist ein Beispiel dafür, wie man dies erreichen kann.

    1) Da diese Eingabezeichenfolge:

    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) Extrahieren von Daten in doppelte Anführungszeichen nach dem Literal Text: so dass die Ergebnisse ein Array mit allen Spielen wie folgt:

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

    LÖSUNG

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

    RUN SNIPPET in einer Arbeits DEMO

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

    Verwandte Themen