5

rcファイルから情報を抽出しようとしています。これらのファイルでは、「-文字列の文字は、c#の逐語的な文字列に類似した2倍( "")でエスケープされます。文字列を抽出する方法はありますか?

たとえば、次の文字列「this is a "" test ""」がある場合、これを取得したいのは ""test""です。また、貪欲でない必要があります(非常に重要です)。

次の正規表現を使用してみました。

"(?<text>[^""]*(""(.|""|[^"])*)*)"

しかし、パフォーマンスはひどいものでした。私はここでの説明に基づいています:http://ad.hominem.org/log/2005/05/quoted_strings.php

正規表現を使用してこれに対処するアイデアはありますか?

4

5 に答える 5

5

そこにいくつかのネストされた繰り返し数量詞があります。これは、パフォーマンスに壊滅的な影響を与える可能性があります。

次のようなものを試してください。

(?<=")(?:[^"]|"")*(?=")

これで、一度に2つの引用符のみを使用できるようになりました...または引用符以外の文字を使用できます。後読みと先読みは、実際の一致の前後に引用符があることを示しています。

これにより、何かをキャプチャする必要がなくなります。目的の結果は、必要な完全な文字列になります(外側の引用符は含まれません)。

外側の引用符が2倍になっていないとは断言しません。もしそうなら、とにかくそれらを空の文字列と区別する方法がないからです。

于 2012-11-21T14:37:03.797 に答える
2

これは、予想よりもはるかに簡単であることがわかります。引用符がエスケープされた文字列リテラルは、一連の単純な文字列リテラルが一緒に実行されているように見えます。

"Some ""escaped"" quotes"

"Some " + "escaped" + " quotes"

したがって、これを一致させるために必要なのはこれだけです。

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

別のステップで先頭と末尾の引用符を取り除く必要がありますが、それは大したことではありません。とにかく、エスケープされた引用符(\"または"")をエスケープ解除するには、別の手順が必要になります。

于 2012-11-21T15:28:35.003 に答える
0

これがm.buettnerのものより良いか悪いかはわかりませんが(推測しないでください-彼は彼のものを知っているようです)、私は批評のためにそれをそこに捨てると思いました。

"(([^"]+(""[^"]+"")*)*)"
于 2012-11-21T15:05:56.073 に答える
0

これを試してみてください(?<=^")(.*?"{2}.*?"{2})(?="$) 。以前の2つよりも高速で、バグはありません。

于 2012-11-21T15:20:00.063 に答える
0
  • 文字列の先頭にある「
  • 複数回一致する非"または2"
  • 文字列を終了する「」に一致する

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

于 2015-03-11T19:33:23.603 に答える