2015-09-08 12 views
6

Ich habe diesen Text:Aufnahme zwei Gruppen von Zahlen mit einem regulären Ausdruck

'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 01 672 1.653.806,08 18.512,98 1.667.621,57 2.647,38 07 23 12.965,11 0,00 12.965,11 0,00 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38' 

Das Originalformat ohne Leerzeichen ersetzt und Bruchlinien ist:

NUMBER OTHER  OTHER  OTHER  BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 

01  672  1.653.806,09 18.512,98  1.667.621,57  2.647,38 
07   23  12.965,11  0,00   12.965,11   0,00 
13   05  10.517,87  0,00   10.517,81   0,00 
TOTAL: 700  1.677.289,00 18.512,98  1.691.104,49  2.647,38 

ich Informationen in der BASE CÁL PREV SOC extrahieren möchten Spalte nur in den Zeilen 01 und 07, aber manchmal gibt es keine 07. Zeile 13 wird ignoriert.

Also ich möchte eine bestimmte Phrase und passende Gruppen in einem regulären Ausdruck haben.

Nur um klar zu sein, diese Daten sind in einem großen Text, so dass die Regex nicht generisch sein kann. Ich muss explizit einen eindeutigen Satz übergeben, der den Zahlen nahe kommt. Hier ist der gewählte Ausdruck 'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC'. Ich will nur die Zahlen in 01 und 07 (obwohl 07 wird manchmal nicht existieren), und ignorieren 13.

Nur um klarer zu sein, im aktuellen Beispiel erwarte ich das Ergebnis 1,667,621.57 und 12.965,11 .

Ich habe diesen Code:

var text = 'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 01 672 1.653.806,08 18.512,98 1.667.621,57 2.647,38 07 23 12.965,11 0,00 12.965,11 0,00 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38'; 

var reg = new RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' + '\\b.*?(?:\\d\\S*\\s+){4}(\\d\\S*)(?:\\s?\\d\\S*\\s+){5}(\\d\\S*)', 'i'); 
var match = reg.exec(text); 

console.log(match[1]); 
console.log(match[2]); 

Ich habe sicher sein, dass die Nummer 01 und 07, und wenn es keine 07 ist, ersetzen Sie es mit 00,00.

Ist das möglich?

+1

'18.517,81' ist nicht in Ihrem Beispiel Daten. Meinst du '10.517,81'? –

+0

Ich verstehe nicht, was du über 07 und 13 sagst. Wenn du nur an 01 und 07 interessiert bist, warum sollte es dann eine Rolle spielen, ob es eine 13 gibt oder nicht? Ignorierst du nicht 13 in allen Fällen? Im obigen Beispiel ist der Wert in 07 12.965,11. Erwarten Sie das nicht? –

+0

Sorry, in meinem Beispiel ist 12.965,11, 18.517,81 ist in der 13 NUMMER, ich möchte ignorieren, wenn die Zahl 13 ist @RickHitchcock –

Antwort

6

Um eine Gruppe zu entsprechen, die nicht im Text vorkommen können, verwenden Sie den ? Modifikator am Ende der Gruppe, wie folgt aus:

'(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?' 

Ein vollständiger regulärer Ausdruck in Ihrem Fall aussehen würde, dies:

var re = RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' + 
        '.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+)' + 
       '(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?'); 

Der erste Teil der Regex-Definition ist die Phrase, die Sie suchen. Lassen Sie uns den zweiten Teil aufgliedern:

  • .*? entspricht null oder mehr Zeichen jeglicher Art (außer Linie abbreche Zeichen) als wenig wie möglich
  • \\s+ Matches ein oder mehrere Leerzeichen
  • 01 entspricht der Zeilennummer
  • (?:\\s+\\S+) ist eine nicht-einfangende Gruppe, die durch ein oder mehr nicht-Leerzeichen gefolgt ein oder mehr Leerzeichen entspricht
  • {3} ma kes das (?:\\s+\\S+) Gruppenspiel dreimal
  • \\s+ Matches ein oder mehr Leerzeichen
  • (\\S+) fängt ein oder mehr Nicht-Leerzeichen — dies ist der Wert, wir suchen

Der dritte Teil der Regex ist ähnlich dem zweiten Teil, außer dass es 07 anstelle von 01 hat, und, im Wesentlichen, ist es in einer nicht-einfangenden, optionalen Gruppe eingeschlossen.

  • (?: beginnt eine nicht-einfangende Gruppe
  • )? die Gruppe endet und macht es optional

Das Wichtigste die ? nach der schließenden Klammer der Gruppe ist. Diese ? macht die ganze Gruppe optional: es kann übereinstimmen oder nicht. Es ist nicht unbedingt notwendig, dass die Gruppe nicht erfasst wird. Wenn wir die ?: nach der öffnenden Klammer weggelassen hätten, würde die Regex immer noch funktionieren, außer dass wir match[3] verwenden müssten, um den Wert aus der Zeile 07 zu extrahieren.

Nach dem Ausführen des regulären Ausdrucks hat eine Gruppe, die nicht übereinstimmen konnte, den Wert . Sie können wie so einen Wert Ihrer Wahl ersetzen:

var value07 = match[2] || '0,00'; 

Im folgenden Code-Schnipsel, versuchen Sie die 07 in den Inhalt mit 08 ersetzt, um zu sehen, was passiert.

var text = document.getElementById('content').innerHTML; 
 

 
// Replace all whitespace with visible spaces. 
 
text = text.replace(/\s+/g, ' '); 
 

 
var re = RegExp('(?:.*BASE CÁL PREV SOC BASE CÁL 13º PREV SOC)+' + 
 
       '(?:.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+))?' + 
 
       '(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?'); 
 

 
var match = re.exec(text), 
 
    value01 = match[1] || '0,00', 
 
    value07 = match[2] || '0,00'; 
 

 
document.write(value01 + '<br><br>'); 
 
document.write(value07 + '<br><br>');
body { 
 
    font-family: sans-serif; 
 
} 
 
#content { 
 
    color: #888; 
 
    margin: 20px 0; 
 
    display: none; 
 
}
<div id="content"> 
 
NUMBER OTHER  OTHER  OTHER  BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 
 

 
01  672  1.653.806,09 18.512,98  1.111.111,11  2.647,38 
 
07   23  12.965,11  0,00   11.111,11   0,00 
 
13   05  10.517,87  0,00   10.517,81   0,00 
 
TOTAL: 700  1.677.289,00 18.512,98  1.691.104,49  2.647,38 
 
    
 
NUMBER OTHER  OTHER  OTHER  BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 
 

 
01  672  1.653.806,09 18.512,98  2.222.222,22  2.647,38 
 
07   23  12.965,11  0,00   22.222,22   0,00 
 
13   05  10.517,87  0,00   10.517,81   0,00 
 
TOTAL: 700  1.677.289,00 18.512,98  1.691.104,49  2.647,38 
 
    
 
NUMBER OTHER  OTHER  OTHER  BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 
 

 
01  672  1.653.806,09 18.512,98  3.333.333,33  2.647,38 
 
07   23  12.965,11  0,00   33.333,33   0,00 
 
13   05  10.517,87  0,00   10.517,81   0,00 
 
TOTAL: 700  1.677.289,00 18.512,98  1.691.104,49  2.647,38 
 
</div>

+0

Michael, wenn ich nicht zu viel frage, kannst du die Regex für mich brechen? Ich studiere sie :) –

+0

Sicher. Bitte sehen Sie meine überarbeitete Antwort. –

+0

Danke Michael, du bist sehr nett! Es hat mir in diesen letzten Tagen sehr geholfen, ich werde dir ewig dankbar sein für deine Hilfe. Ich habe alle Regex, die ich brauchte, dank dir erledigt. Wir sehen uns in zwei Tagen. –

1
var text = 'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 01 672 1.653.806,08 18.512,98 1.667.621,57 2.647,38 07 23 12.965,11 0,00 12.965,11 0,00 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38' 
var reg = new RegExp("\\b(?:01|07)\\b(?:\\s+[\\d.,]+){3}\\s+([\\d.,]+)", 'g') 
while(match = reg.exec(text)) { 
    console.log(match[1]) 
} 
+0

lass mich das testen. –

+0

ich kann das nicht benutzen @smathy, ich brauche das Wort BASIS CÁL PREV SOC BASIS CÁL 13º PREV SOC =/ –

+0

Warum? Welchen Input kannst du bekommen, wenn meine Regex für deine Zwecke nicht funktioniert? – smathy

Verwandte Themen