私は正規表現でウルトラエディットを使用しています。二重引用符で始まる/終わる文字列内で見つかった二重引用符を検索 (および置換) して埋め込みたいと思います。これは、パイプ | を含むテキスト ファイルです。デリメータとして。
埋め込まれた二重引用符を見つける方法:
"この文字列は問題ありません。"|"これは、"C" を二重引用符で囲んだ例です。"|"次の行"
最終的には、「C」の二重引用符を置き換えて、C だけにする必要があります。
CSV の大きなトレードオフは、すべてのケースで正しい解析とシンプルさです。これは、適切に調整されたアプローチです。パイプの横に引用符が付いた非常に巧妙な文字列がある場合は、PERL や Text::CSV などを使用することをお勧めします。
[^|]
パーサーが C を吸収し、C の隣にある他の引用符を見つけられないという点で、引用符の両側に非パイプ文字 ( など) を必要とする正規表現には問題があります。
この例は、実際の CSV 文字列でパイプと引用符が隣り合っていない限り、うまく機能します。先読みと後読みはゼロ幅であるため、引用符以外の追加文字は削除されません。
1 2 3 4
(?<!^)(?<!\|)"(?!\|)(?!$)
このように一致したすべての引用符を削除できます。すべての引用符を取得するには、グローバル置換を指定することを忘れないでください。
この発見を試してください:
(["][^"]*)["]C["]([^"]*["])
そして置き換えます:
\1C\2
Perl モードで正規表現をオンにします。
のスクリーンショット
UltraEdit Professional Text/HEX Editor
Version 21.30.0.1005
皮切りに:
"This string is ok."|"This is example with a "C" double quoted grade in middle."|"Next line"
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
で終わる:
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
最初の部分。
(["][^"]*)
from (["][^"]*)["]C["]([^"]*["])
これは、次のシーケンスを探します。
["]
.[^"]*
["][^"]*
は、正規表現エンジンがこの文字列を格納して、 REPLACE 部分が (後方参照として) 参照できるようにする必要があることを示しています。第二部。
["]C["]
from (["][^"]*)["]C["]([^"]*["])
これは、次のシーケンスを探します。
["]
.["]
.\1C\2
\1
これを最初に保存されたシーケンスに置き換えることを意味する後方参照です。\2
これを 2 番目に保存されたシーケンスに置き換えることを意味する後方参照です。nannyが良い解決策を投稿しましたが、Perl スクリプト用であり、UltraEdit のようなテキスト エディターで使用するためのものではありません。
一般に、フィールド値内に二重引用符を含めることができます。ただし、各二重引用符は、もう 1 つの二重引用符でエスケープする必要があります。これは、コンマ区切り値に関するウィキペディアの記事などで説明されています。
この非常に単純なエスケープ アルゴリズムにより、プログラミング言語でコード化された文字単位での CSV ファイルの読み取りが非常に簡単になります。しかし、二重引用符で囲まれた値に含まれる二重引用符、区切り文字、および改行は、CSV ファイル内の正規表現の検索と置換にとって悪夢です。
UltraEdit マクロにいくつかの置換を記録しました
InsertMode
ColumnModeOff
Top
PerlReOn
Find MatchCase RegExp "^"|"$"
Replace All "QuOtE"
Find MatchCase ""|"
Replace All "QuOtE|"
Find MatchCase "|""
Replace All "|QuOtE"
Find MatchCase """"
Replace All "QuOtEQuOtE"
Find MatchCase """
Replace All """"
Find MatchCase "QuOtE"
Replace All """
最初の置換は、Perl 正規表現の置換です。行頭または行末の各二重引用符は、この置換によって文字列QuOtEに置き換えられます。QuOtEが CSV ファイルに存在しないことは確かです。
パイプ文字の前後の各二重引用符も、次の 2 つの非正規表現置換によってQuOtEに置き換えられます。
""
CSV ファイル内のエスケープされた二重引用符は、次にQuOtEQuOtEに置き換えられ、非正規表現で置き換えられます。
現在、残りの一重引用符は 2 つの二重引用符に置き換えられ、CSV ファイルで有効になります。もちろん、これらの一重引用符を削除することもできます。
最後に、すべてのQuOtEが二重引用符に置き換えられます。
注:これは最終的な解決策ではありません。これらの置換は、たとえば、このような既に有効な CSV 行の場合など、間違った結果を生成する可能性があります。
"first value with separator ""|"" included"|second value|"third value again with separator|"|fourth value contains ""Hello!"""|fifth value
結果として
"first value with separator """|""" included"|second value|"third value again with separator|"|fourth value contains ""Hello!"""|fifth value
PS: 上記の有効な例の行は、スプレッドシート アプリケーションでは次のように表示されます。
first value with separator "|" included second value third value again with separator| fourth value contains "Hello!" fifth value