6

終了していない二重引用符で囲まれた文字列で終わる CSV ファイル内の行を検索する必要があります。

例えば:

1,2,a,b,"dog","rabbit

一致しますが、

1,2,a,b,"dog","rabbit","cat bird"
1,2,a,b,"dog",rabbit

しません。

私は正規表現の経験が非常に限られており、私が考えることができる唯一のことは次のようなものです

"[^"]*$

ただし、これは最後の引用符から行末までに一致します。

これはどのように行われますか?

4

4 に答える 4

5

引用符をエスケープできないと仮定すると、引用符のパリティをテストする必要があります (奇数ではなく偶数であることを確認してください)。そのためには正規表現が最適です。

^(([^"]*"){2})*[^"]*$

これは、引用符の数が偶数のすべての行に一致します。奇数のすべての文字列の結果を反転できます。([^"]*")または、最初に別の部分を追加することもできます。

^[^"]*"(([^"]*"){2})*[^"]*$

同様に、貪欲な演算子ではなく消極的な演算子にアクセスできる場合は、より単純に見える式を使用できます。

^((.*"){2})*.*$         #even
^.*"((.*"){2})*.*$      #odd

ここで、引用符をエスケープできる場合、それはまったく別の問題ですが、アプローチは似ています: エスケープされていない引用符のパリティを決定します。

于 2010-05-25T15:59:45.560 に答える
4

文字列に を含めることができないと仮定すると、"次のように奇数の引用符を持つ文字列に一致させる必要があります。

([^"]*("[^"]*")?)*"

これは DDOS 攻撃に対して脆弱であることに注意してください。

これは、引用符で囲まれた文字列が後に続く、引用符で囲まれていない run の 0 個以上のセットに一致します。

于 2010-05-25T15:59:41.730 に答える
1

これを試してください:

".+[^"](,|$)

これは、引用符 (行内の任意の場所) に一致し、その後に (貪欲に)行末またはコンマの前に別の引用符以外のものが続きます。

正味の影響は、ぶら下がっている引用符付きの文字列を持つ行のみに一致することです。

「ネストされたエクスパンド攻撃」に対しても免疫があると思います(私たちは非常に危険な世界に住んでいます...)

于 2010-05-25T16:39:24.833 に答える
0

「ネストされたエキスパンド」を回避するには:

egrep -v '^[^"]*("[^"]*"[^"]*)*[^"]*$' my_file
于 2010-05-25T16:05:04.797 に答える