1

私は正規表現でウルトラエディットを使用しています。二重引用符で始まる/終わる文字列内で見つかった二重引用符を検索 (および置換) して埋め込みたいと思います。これは、パイプ | を含むテキスト ファイルです。デリメータとして。

埋め込まれた二重引用符を見つける方法:

"この文字列は問題ありません。"|"これは、"C" を二重引用符で囲んだ例です。"|"次の行"

最終的には、「C」の二重引用符を置き換えて、C だけにする必要があります。

4

5 に答える 5

3

CSV の大きなトレードオフは、すべてのケースで正しい解析とシンプルさです。これは、適切に調整されたアプローチです。パイプの横に引用符が付いた非常に巧妙な文字列がある場合は、PERL や Text::CSV などを使用することをお勧めします。

[^|]パーサーが C を吸収し、C の隣にある他の引用符を見つけられないという点で、引用符の両側に非パイプ文字 ( など) を必要とする正規表現には問題があります。

この例は、実際の CSV 文字列でパイプと引用符が隣り合っていない限り、うまく機能します。先読みと後読みはゼロ幅であるため、引用符以外の追加文字は削除されません。

   1     2       3    4
(?<!^)(?<!\|)"(?!\|)(?!$)
  1. 行頭の引用符を一致させないでください。
  2. 引用符の前にパイプを付けないでください。
  3. その後、引用符をパイプと一致させないでください。
  4. 文字列の末尾の引用符を一致させないでください。

このように一致したすべての引用符を削除できます。すべての引用符を取得するには、グローバル置換を指定することを忘れないでください。

于 2015-01-26T17:33:09.577 に答える
1

この発見を試してください:

(["][^"]*)["]C["]([^"]*["])

そして置き換えます:

\1C\2

Perl モードで正規表現をオンにします。

UltraEdit の検索置換正規表現のスクリーン ショット

のスクリーンショット

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"

正規表現 FIND の内訳。

最初の部分。

(["][^"]*)
from (["][^"]*)["]C["]([^"]*["])

これは、次のシーケンスを探します。

  1. 二重引用符: ["].
  2. 二重引用符ではない任意の数の文字:[^"]*
  3. 囲んでいる角かっこ["][^"]*は、正規表現エンジンがこの文字列を格納して、 REPLACE 部分が (後方参照として) 参照できるようにする必要があることを示しています。
  4. これは最初と最後で繰り返されることに注意してください。つまり、2 つのシーケンスが格納されています。

第二部。

["]C["]
from (["][^"]*)["]C["]([^"]*["])

これは、次のシーケンスを探します。

  1. 二重引用符: ["].
  2. 大文字の C (Cookie を表す場合と表さない場合があります)。
  3. 二重引用符: ["].

正規表現 REPLACE の内訳。

\1C\2
  1. \1これを最初に保存されたシーケンスに置き換えることを意味する後方参照です。
  2. 大文字の C (Cookie を表す場合と表さない場合があります)。
  3. \2これを 2 番目に保存されたシーケンスに置き換えることを意味する後方参照です。
于 2014-11-25T01:04:56.467 に答える
0

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
于 2014-11-29T14:54:18.340 に答える
0

あなたが与えた例では"\w"、見つけるための正規表現として機能します"C"

ここで試してみてください

交換メカニズムはおそらくultraeditに組み込まれています

于 2014-11-24T19:15:37.557 に答える