2016-05-10 9 views
1

Meine mehrzeiliges Eingabe string:Erhalten erste Strings aus einem mehrzeiligen Text getrimmt

123 
2345 a 

ab_cd: xxxx 
    123abc  456 
:y 

I Want ist das erste Spiel jeder Zeile bekommen möchte, wo das Muster [0-9a-z_]{1,100} paßt - Leerraum am Anfang ignoriert und leere Zeilen.

So würde mein erwartetes Ergebnis zu sein:

123 
2345 
ab_cd 
123abc 

Mein Muster nicht zu funktionieren scheint:

$entries = string.match(/^(?:\s*)([a-z0-9_]{1,100})(?:.*)$/gm);  

Die Nicht-Erfassung Gruppe scheint ignoriert zu werden. Ich bekomme:

[ "123", " 2345 a", " ab_cd: xxxx", " 123abc  456" ] 

Nur :y wird korrekt ignoriert. Was mache ich hier falsch? Obwohl ich dieses Tag hinzugefügt habe, denke ich, es ist kein JS-Problem ...

Bearbeiten: Ich wäre glücklich, das Problem mit dem Regex-Muster zu lösen, nicht mit JS bedeutet.

+0

Was sind die nicht einfangenden Gruppen * für *? Wäre nicht '/^\ s * ([a-z0-9 _] {1.100}). * $/Gm' ausreichend? (Oder einfach nur '/^\ s * ([a-z0-9 _] {1.100})/gm'?) – Biffen

+0

@Biffen Ich dachte ich muss explizit erklären was ich nicht will. Ich möchte nur '([a-z0-9 _] {1.100})' bekommen. Wahrscheinlich habe ich nicht ganz verstanden. – robsch

+0

Das ist nicht ganz so wie es funktioniert. Solange Sie das, was Sie * wollen, in eine Gruppe einbinden, können Sie das Teil nur durch seine Gruppennummer erhalten. – Biffen

Antwort

1

können Sie

verwenden
/^[ \t]*([0-9a-z_]{1,100})/gm 

Und greifen Sie den Wert in Gruppe 1.

Wenn auch Sie müssen in Großbuchstaben entsprechen, verwenden Sie einfach

/^[ \t]*(\w{1,100})/gm 
     ^^ 

Siehe regex demo

var re = /^[ \t]*(\w{1,100})/gm; 
 
var str = '123\n 2345 a\n\nab_cd: xxxx\n 123abc  456\n:y'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

Muster Details: Es verwendet /gm flags - global und mehrzeilige Modifikatoren, um alle su zu finden bstrings kann das Muster finden und ^ den Anfang der Zeilen entsprechen lassen.

  • ^ - Anfang einer Zeile
  • [ \t]* - 0+ Räume oder Tabulator
  • ([0-9a-z_]{1,100}) - Gruppe 1: 1 bis 100 Buchstaben, Ziffern oder _. Wenn auch Großbuchstaben übereinstimmen, verwenden Sie stattdessen \w.
+0

Kann es sein, dass es mit der Funktion match() nicht genau funktioniert? Dort ist das nachlaufende Leerzeichen noch vorhanden. Natürlich kann ich das mit JS beheben, aber es sollte auch mit dem Muster möglich sein. Oder nicht? Und die Verwendung von '\ s' anstelle von' [\ t] 'ist in Ordnung? – robsch

+1

'String # match()' [behält keine aufgezeichneten Substrings] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/match), wenn die Regex mit einem globalen deklariert wird Modifizierer '/ g'. –

+1

Ich habe '\ s' nicht mit Absicht verwendet, da' \ s' Zeilenschaltungen verwenden kann. Wenn Sie leere Zeilen suchen müssen, können Sie '\ s' anstelle von' [\ t] 'verwenden. Als Alternative zu '[\ t]' können Sie auch '[^ \ S \ r \ n]' verwenden, um nur horizontale Leerzeichen zu finden. –

0

Sie können mit tun Split-Trimm-Join Formel

var output = string.split("\n").map(function(val){ 
    return val.trim() 
}).join("\n"); 

Mehr Cross-Plattform-Weg (die Betreuung von \r auch)

var output = string.replace(/\r\n/g,"\n").split("\n").map(function(val){ 
    return val.trim() 
}).join("\n"); 
0

Sie Regex etwas aussehen kann:

/^[\s]*([\da-z_]{1,100})/gm 

Regex101 Demo


Regex Erläuterung:

^ assert position at start of a line 
[\s]* match a single character present in the list below 
    Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
    \s match any white space character [\r\n\t\f ] 
1st Capturing group ([0-9a-z_]{1,100}) 
    [0-9a-z_]{1,100} match a single character present in the list below 
     Quantifier: {1,100} Between 1 and 100 times, as many times as possible, giving back as needed [greedy] 
     0-9 a single character in the range between 0 and 9 
     a-z a single character in the range between a and z (case sensitive) 
     _ the literal character _ 
m modifier: multi-line. Causes^and $ to match the begin/end of each line (not only begin/end of string) 
g modifier: global. All matches (don't return on first match) 
Verwandte Themen