私は次のような文字列を持っています
a;b;"aaa;;;bccc";deef
二重引用符で囲まれてい;
ない場合にのみ、区切り文字に基づいて文字列を分割したい。;
分割後は
a
b
"aaa;;;bccc"
deef
後読みしてみましたが、分割するための正しい正規表現が見つかりません。
私は次のような文字列を持っています
a;b;"aaa;;;bccc";deef
二重引用符で囲まれてい;
ない場合にのみ、区切り文字に基づいて文字列を分割したい。;
分割後は
a
b
"aaa;;;bccc"
deef
後読みしてみましたが、分割するための正しい正規表現が見つかりません。
正規表現は、おそらくこれに適したツールではありません。可能であれば、CSV ライブラリを使用;
し、区切り文字と"
引用符として指定する必要があります。これにより、探している正確なフィールドが得られます。
;
ここで言われているのは、分割を検討している文字列と文字列の末尾の間に偶数の引用符があることを確認することによって機能する 1 つのアプローチです。
;(?=(([^"]*"){2})*[^"]*$)
例: http://www.rubular.com/r/RyLQyR8F19
たとえば、文字列内で引用符をエスケープできる場合、これはうまくいきませんa;"foo\"bar";c
。
これは、Python のcsv モジュールを使用したよりクリーンな例です。
import csv, StringIO
reader = csv.reader(StringIO.StringIO('a;b;"aaa;;;bccc";deef'),
delimiter=';', quotechar='"')
for row in reader:
print '\n'.join(row)
これはちょっと醜いですが、引用符で囲まれた文字列の中に \" がない場合 (つまり、このような文字列 ("foo bar \"badoo\" goo") がない場合) は、最初に " で分割できます。次に、すべての偶数番号の配列要素が実際には文字列であると仮定します (そして、奇数番号の要素を ; トークンのコンポーネント部分に分割します)。
*文字列に \" が含まれている場合は、最初にそれらを他の一時的なトークンに変換し、後で操作を実行した後に元に戻す必要があります。
ここにフィドルがあります...
var str = 'abc;def;ghi"some other dogs say \\"bow; wow; wow\\". yes they do!"and another; and a fifth'
var strCp = str.replace(/\\"/g,"--##--");
var parts = strCp.split(/"/);
var allPieces = new Array();
for(var i in parts){
if(i % 2 == 0){
var innerParts = parts[i].split(/\;/)
for(var j in innerParts)
allPieces.push(innerParts[j])
}
else{
allPieces.push('"' + parts[i] +'"')
}
}
for(var a in allPieces){
allPieces[a] = allPieces[a].replace(/--##--/g,'\\"');
}
console.log(allPieces)