2016-09-24 6 views
2

私はこの文字列を持っている:Javascriptの正規表現のコンマ区切りのテキスト

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

私はカンマで区切られた文字列にマッチし、抽出したいです。

結果は次のようになります

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' 

私はこの正規表現を有する:

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

をけれども 'AL'(カンマで区切られた)状態を有するそれらの都市が誤って分離されています。それ自己(remote:[a-zA-Z]+\|.*)またはMD5ハッシュ([a-f0-9]{32},?)の後に持ってコンマで、エンドマッチ - 私はこのような何かをやって考えていた

からremote:[a-zA-Z]+\|.*

解決策。ここで

は私の正規表現テスターのリンクです:

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

+0

の代わりに正規表現、 '' line.splitを( "")してみてください。私を信じて、正規表現 – vlaz

+0

@vlazでCSVを解析する価値はありません。それはリモート出力します:City | Vestavia HillsとALは2つの異なる結果を返します – mwebber

答えて

1

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

傑作!正確に私の考えに基づいて:P – mwebber

+0

@mwebber私は助けになることができてうれしいです:) – Redu

0

一つの選択肢では、JavaScriptのスプリットを使用することです:

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

は結果を生成しません。 – mwebber

1

あなたがにあなたの正規表現を微調整することができますこの先読みベースの正規表現:

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

これはあなたが期待しているように6つの捕獲されたグループを与えるでしょう。

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

説明に感謝します:) – mwebber

+0

最後の質問、なぜ生成するのですか? "、"リモート:Citystate | Vestavia Hills "、" 395b5231539390675a7abe0751fc4820 "、"リモート:市| Vestavia Hills、AL "、"リモート:Citystate | Vestavia Hills "、" 395b5231539390675a7abe0751fc4820 "]'それらのうちのいくつか?) – mwebber

+0

'while'ループで' exec'を使用し、キャプチャしたグループ#1を取得すると、開始カンマはありません。 regex101のデモリンクでさえ、JSコードが生成されています。 – anubhava

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

のみコンマの後に2つのuppcaseレター可能よりも、この1を理解することは簡単ですが、私は、グループに特別なオプションsufixを作りました。次のように行う可能性があります単一の正規表現で

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

関連する問題