2016-09-24 5 views
2

Ich habe diese Saite:Javascript Regex Komma getrennt Text

remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820

Ich möchte passen und Extrakt Strings mit Komma getrennt.

MATCH 1 
'remote:City|Vestavia Hills,AL' 
MATCH 2 
'remote:Citystate|Vestavia Hills' 
MATCH 3 
'395b5231539390675a7abe0751fc4820' 
MATCH 4 
'remote:City|Vestavia Hills,AL' 
MATCH 5 
'remote:Citystate|Vestavia Hills' 
MATCH 6 
'395b5231539390675a7abe0751fc4820' 

Ich habe diese regex: falsch

(remote:[a-zA-Z]+\|[^\,]+|[a-f0-9]{32}) 

aber die Städte, den Staat 'AL' haben (getrennt durch Komma) getrennt

sollte das Ergebnis sein.

Mögliche Lösung:

Ich dachte an so etwas wie dies zu tun - remote:[a-zA-Z]+\|.* - und End-Match auf dem Komma, die, nachdem sie selbst haben (remote:[a-zA-Z]+\|.*) oder MD5-Hash ([a-f0-9]{32},?).

Hier ist meine Regex Tester Link:

https://regex101.com/r/rP8iJ2/1

+0

Statt regex, versuchen 'line.split ("")'. Vertrauen Sie mir, es ist nicht wert, CSV mit Regex zu analysieren – vlaz

+0

@vlaz es wird nicht das Ergebnis produzieren, das ich will ..es wird Remote ausgeben: Stadt | Vestavia Hills und AL als zwei unterschiedliche Ergebnisse – mwebber

Antwort

1

Mit einem einzigen Regex Sie wie folgt tun könnte;

var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820", 
 
    arr = str.match(/(r.+?|[\da-f]{32})(?=,?(remote|[\da-f]{32}|$))/g); 
 
console.log(arr);

+0

Meisterwerk! genau basierend auf meiner Idee: P – mwebber

+0

@mwebber Ich bin froh, dass ich in Hilfe sein könnte :) – Redu

0

Eine Option ist Split von Javascript zu verwenden:

var str = "remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820,remote:City|Vestavia Hills,AL,remote:Citystate|Vestavia Hills,395b5231539390675a7abe0751fc4820"; 
 
var aux = str.split("remote"); 
 
var res = []; 
 
for (var i=1 ; i < aux.length ; i++){ 
 
\t res.push("remote" + aux[i]); 
 
}; 
 
console.log(res);

+1

ergibt nicht das Ergebnis, das ich will – mwebber

1

Sie können Ihre regex Feinabstimmung in Dieser Lookahead basierte Regex:

/(?:^|,)(.+?(?=,(?:[a-f0-9]{32}|remote:)|$))/igm 

Dies ergibt 6 erfasste Gruppen wie erwartet.

Updated RegEx Demo

(?:^|,)     # Match line start or comma 
(      # captured group #1 start 
    .+?     # match 1 or more of any character (lazy) 
    (?=     # lookahead start 
     ,     # match comma followed by 
     (?:    # non-capturing group start 
     [a-f0-9]{32} # match hex digit 32 times 
     |    # OR 
     remote:  # match literal "remote:" 
    )     # non-capturing group end 
     |     # OR 
     $     # line end 
    )     # looakehad end 
)      # capturing group #1 end 
+1

danke für die Erklärung :) – mwebber

+0

letzte Frage, warum es produziert - '[" remote: City | Vestavia Hills, AL ",", remote: Citystate | Vestavia Hills ",", 395b5231539390675a7abe0751fc4820 ",", remote: Stadt | Vestavia Hills, AL ",", entfernt: Cortestate | Vestavia Hills ",", 395b5231539390675a7abe0751fc4820 "]' (Komm Komma ab einige von ihnen?) – mwebber

+0

Wenn Sie 'exec' in einer' while' Schleife verwenden und die gefangene Gruppe # 1 aufnehmen, dann wird kein Komma beginnen. Sogar regex101 Demo-Link hat diesen JS-Code generiert. – anubhava

1
([a-f0-9]{32}|remote:[^|]+\|[^,]+(?:,[A-Z]{2})?),? 

Dieser ist einfacher zu verstehen, habe ich eine besondere optional sufix der Gruppe, als nur 2 uppcase Buchstaben nach einem Komma sein kann.

https://regex101.com/r/rP8iJ2/3

Verwandte Themen