2016-09-06 12 views
0

JavaScriptで解析したいProgress OpenEdgeシステムからのデータエクスポートがあります。私は、正規表現を使用して、エクスポートのすべてのフィールドを検索したいと思います。OpenEdgeデータエクスポートで引用符付きの文字列を解析するための正規表現

私はこれに似た多くのことを試しました:/("[^"]*")|[^\s]+/g私はまた、否定的な先読みを試してみました(?!"")しかし、これまで成功していません。

サンプル輸出出力は、これに似たものに見えるかもしれません:

12345 24,25 0 2015-06-30T14:53:14.891 "12345" "24,25" "0" "2015-06-30T14:53:14.891" "" yes no ? "String with ""quoted"" word" "String 
with a multi 
line string. "" <- Just a quote 
" " This is the last value " 
6789 35,36 0 2016-07-31T15:54:15.892 "6789" "35,36" "0" "2016-07-31T15:54:15.892" "" no yes ? "Just a simple string" ? ? 

フィールドは以下のとおりです。

DEFINE TEMP-TABLE tt_test NO-UNDO 
    FIELD valueA AS INTEGER 
    FIELD valueB AS DECIMAL 
    FIELD valueC AS INTEGER 
    FIELD valueD AS DATETIME 
    FIELD valueE AS CHARACTER 
    FIELD valueF AS CHARACTER 
    FIELD valueG AS CHARACTER 
    FIELD valueH AS CHARACTER 
    FIELD valueI AS CHARACTER 
    FIELD valueJ AS LOGICAL 
    FIELD valueK AS LOGICAL 
    FIELD valueL AS LOGICAL 
    FIELD valueM AS CHARACTER 
    FIELD valueN AS CHARACTER 
    FIELD valueO AS CHARACTER 
. 

エクスポート形式は次のとおりです。 すべてのフィールドが空白で区切られます。 2つの二重引用符( "")を使用してエスケープされる文字列に引用符がある場合、2つの二重引用符( " 「」)が、それらの周りの区切りにスペースを持つ。

実際のデータ型と、これは進歩システムであるという事実は、それだけで私の質問にいくつかのコンテキストを与えることだ、問題ではありません。

をので、要約します:エスケープされた文字列の二重引用符を無視して、エクスポートされたデータのさまざまな部分を正常に区切る(JavaScript互換の)正規表現を作成するにはどうすればよいですか?

答えて

1

これは1つの正規表現では実行できないと思います。ここにパーサが必要です。幸いなことに、例えば、書くことは非常に簡単になります。

str = `12345 24,25 0 2015-06-30T14:53:14.891 "12345" "24,25" "0" "2015-06-30T14:53:14.891" "" yes no ? "String with ""quoted"" word" "String 
 
with a multi 
 
line string. "" <- Just a quote 
 
" " This is the last value " 
 
6789 35,36 0 2016-07-31T15:54:15.892 "6789" "35,36" "0" "2016-07-31T15:54:15.892" "" no yes ? "Just a simple string" ? ?`; 
 

 
str = str.replace(/""/g, '@'); 
 

 
matches = str.match(/"([\s\S]*?)"|\S+|\n/g); 
 

 
rows = [[]] 
 

 
for(var m of matches) { 
 
    if (m === '\n') { 
 
     rows.push([]); 
 
     continue; 
 
    } 
 
    if(m === '@') { 
 
     m = ''; 
 
    } 
 
    if (m[0] === '"') { 
 
     m = m.slice(1, -1); 
 
    } 
 
    m = m.replace(/@/g, '"'); 
 
    rows[rows.length - 1].push(m) 
 
} 
 

 
console.log(rows)

+0

ありがとうございました!私は恐れていたかもしれない。 – Patrik

関連する問題