2

組み込みの機能を使用して、含まれている引用符で csv 文字列を分割する方法について、さまざまな回答を調べました。さまざまな回答を調べてテストしましたが、次の文字列が機能することがわかりました。

"\"([^\"]*)\"" + //Zero or more not-quoted characters inside of quotes
"|" + //or
"(?<=,|^)" + 
"([^,]*)" + //all characters not delimiter
"(?=,|$)"  //delimiter or end of string 

特に上記のコメントされていないセクションで、何が起こっているのかを自分の知識で解決しようとしています。誰でも説明できますか?

4

1 に答える 1

2

(?<=,|^)および(?=,|$)は、(それぞれ)ポジティブルックビハインドおよびルックアヘッドと呼ばれるものを実装するための正規表現アサーションです。

正規表現(わかりやすくするためにJava文字列構築の引用符と連結符を削除)は次のように一致します。

"([^"]*)"  // 0+ not-quote characters inside of quotes (captured)
|          // OR 
      ([^,]*)          // any 0+ character which is not , (captured) only if
             (?<=,|^)  // preceded by , or at start of line AND
             (?=,|$)   // followed by , or at end of line

これらの構成は、テスト文字列内の文字を消費しないため、ゼロ幅と呼ばれます。アサーションの負のバージョンも存在し、の!代わりにを使用します=。これ は、式の前にアサーションがない場合(ルックビハインド)または後にアサーションが続く場合(ルックアヘッド)にのみ一致することを意味します(?<!,|^)(?!,|$)

詳細はこちら

于 2013-01-07T03:20:06.420 に答える