1

制御できない形式を使用するファイル用に、Sprache と C# でパーサーを作成しました。それを使用すると、正しく変換できます:

a = "my string";

の中へ

my string

パーサー (引用されたテキストのみ) は現在、次のようになっています。

public static readonly Parser<string> QuotedText =
    from open in Parse.Char('"').Token()
    from content in Parse.CharExcept('"').Many().Text().Token()
    from close in Parse.Char('"').Token()
    select content;

ただし、私が使用している形式は、「二重二重」引用符を使用して引用符をエスケープします。

a = "a ""string"".";

これを解析しようとすると、何も返されません。次のように返されます。

a ""string"".

さらに

a = "";

string.Emptyまたは同様のものに解析する必要があります。

、または次のようなことを行うこのような回答に基づいて、正規表現を試してみましたが失敗しました:"(?:[^;])*"

public static readonly Parser<string> QuotedText =
    from content in Parse.Regex("""(?:[^;])*""").Token()

これは機能しません (つまり、上記のケースでは一致が返されません)。私の初心者の正規表現スキルが邪魔になっていると思います。誰にもヒントはありますか?

編集:ここでテストしていました- http://regex101.com/r/eJ9aH1

4

4 に答える 4

2

私があなたを正しく理解しているなら、これはあなたが探している種類の正規表現です:

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

デモを参照してください。1."開始引用符に一致します。 2. (?:""|[^"])*2 つの引用符または引用符ではない任意の文字 (改行を含む) に一致し、繰り返します。 3."終了引用符に一致します。

しかし、それは常にあなたの入力がバランスが取れているかどうかにかかっています. そうでない場合は、誤検知が発生します。そして、"string"", which should be matched?"string"" ,""` のような文字列がある場合、または何もない場合は?... それは難しい決断ですが、幸いなことに、入力内容に確信が持てれば、そうする必要はありません。

于 2014-06-13T02:52:26.983 に答える
1

このパターンから目的の出力を適応させることができます。

"(.+".+")"|(".+?")|("")

例:

http://regex101.com/r/lO1vZ4

于 2014-06-13T03:23:24.153 に答える
0

連続する二重引用符のみを無視したい場合は、これを試してください:

("{2,})

ライブデモ

于 2014-06-13T02:17:58.473 に答える