1

私はCSVからの行を持っています

first decimal;;;first text;;second text with newlines, special symbols, including semicolons;second decimal, always present;first dot separated float, may not present;second dot separated float, may not present;third text that present only if present previous float

2 番目のテキストを削除する必要があります (改行と特殊記号を使用)。

今のところ、次のような表現があります。

(?<=;;)(.*?)(?=;\d+)

最初の部分は機能せず、セミコロンが 2 つだけ前にあるテキストを選択する方法がわかりません (今のところ、dotall をオンにすると、2 つ以上のセミコロンが前にあるテキストと、セミコロン + 改行が前にある最初の 10 進数が選択されます) )。その上、ここに改行記号を含める方法がわかりません(.*?)

4

1 に答える 1

1

引用符で囲まれたフィールドの一部としてセミコロンと改行を含む CSV ファイルがある場合、正規表現はこれに適したツールではありません。次のようなフィールドがあるとどうなるか想像してみてください"This is one field;;don't split this;42"...

引用符で囲まれたフィールドの前または中にセミコロンが 2 つないことが確実な場合は、正規表現を試してみてください。しかし、専用の CSV パーサーの方が確実に安全です。

とはいえ、正規表現が失敗する理由を見てみましょう。

ラインを想像してみてください1;;;2;3;2すべての要件を満たしているため、正規表現は一致します。前に 2 つのセミコロンがあり、その後にセミコロンと数字があります。これは、文字列内のこの位置で可能な最短の一致でもあります。

あなたは何ができますか?別の後読みアサーションを使用して、現在の位置の前に 3 つのセミコロンが一致しないことを確認できます。

(?<=;;)(?<!;;;)(.*?)(?=;\d+)

試してみてください - ただし、CSV ライブラリも調べてください。問題をより適切に解決してくれるからです。

于 2013-10-22T05:34:41.757 に答える