0

CSV の二重引用符で囲まれた要素内のコンマをプレースホルダー テキストに置き換えようとしています。

たとえば、CSV に次の行があるとします。
1,2,"three,four,five",6,7,8,"nine,ten",11,12

この正規表現を使用する (Java 用にエスケープされた引用符):
(?<=\")([^"]+?),([^"]+?)(?=\")

最初の一致を次のように置き換えます。

$1<COMMA>$2

これにより、次の結果文字列が得られます。

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12 

一致するものがなくなるまで、resultString に対してこれらの手順を繰り返します。プログレッシブ結果文字列は次のとおりです。

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6,7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12 

正規表現を微調整して、リスト項目内の「、」のみを置き換え、区切り文字自体を置き換えるにはどうすればよいですか? 3 回目の反復では、",6,7,8," で一致しています。

後読みを 1 つの dbl 引用符のみに一致させ、その周りに dble 引用符がないか、または 3 つの dbl 引用符のグループにすることでこれを防ごうとしましたが、「後読みグループには明らかな最大長がありません」というエラーが発生しました。

4

2 に答える 2

1

引用符内の最初の一致文字がカンマにならないように変更できます: (?<=\")([^",][^"]*?),([^"]+?)(?=\").

そうは言っても、このように反復が停止するまで反復することは、非常に良い方法だとは思いません。個人的には、エスケープされていない列を使用して行を文字列の配列に分割し、配列を反復処理して、配列"内の区切り文字列ごとに /g 修飾子を使用して検索と置換を行うでしょう。しかし、それは私が思うに個人的な選択です。

于 2013-06-12T23:07:45.037 に答える
0

簡単なグーグルの後:

^(("(?:[^"]|"")*"|[^,]*)(,("(?:[^"]|"")*"|[^,]*))*)$

これは、csv ファイルの行にある単一の要素に一致します。

http://www.kimgentes.com/worshiptech-web-tools-page/2008/10/14/regex-pattern-for-parsing-csv-files-with-embedded-commas-dou.html

于 2013-06-12T22:54:51.970 に答える