2012-02-13 7 views
1

外側の二重引用符はバックスラッシュでエスケープする必要があります(それ以外の場合は一致しません)。したがって、たとえば
"GET "anything/here.txt""
これは適切な行ではありません。ルビー正規表現についての脱出を脱出

私は正規表現を書くのに多くの方法を試しましたが、仕事をしました。誰もがこれで私を助けることができますか?

答えて

5

あなたは肯定後読みを使用することができます「二重引用符は、接頭辞バックスラッシュなしで外二重引用符の内側に表示された場合、それが一致していません」

いくつかのコメント:

\A\z:と終了文字列の始まるだけでこれらの試合。パターンは全体の文字列と一致する必要があり、その一部ではありません。 (?<=):これは肯定的なlookbehindの構文です。現在の位置の直前にパターンと一致しなければならないと主張する。したがって、(?<=\\)"は、 "二重引用符の前にバックスラッシュが付きます"と一致します。 [^"]:これは "バックスラッシュではない任意の文字"と一致します。この正規表現について

一つのポイントは、それが バックスラッシュが先行し、内側の二重引用符が一致することです。それが問題であれば、コメントを投稿して修正します。最初の正規表現とは異なり、この1つは(引用符をエスケープとして二重のバックスラッシュをカウントしていないこと

/\A"(\\.|[^"\\])*"\z/

注:ルビーのバージョンが後読みを持っていない場合は

、あなたのような何かを行うことができます最初のバックスラッシュは2番目のバックスラッシュをエスケープします)、"\\""は一致しません。

+0

こんにちは、ありがとうございました。これはこれを行うための非常に良い方法です。しかし1つの問題は、私のルビーバージョンは1.8.6で、これは '? 'をサポートしていないことです。あなたはこれについて何か考えていますか? –

+0

@AllanJiang、私はlookbehindを使用しない別のソリューションを追加します。 –

+0

ありがとうございます。私の言ったように動作します...しかし、あなたの答えに別の問題が見つかりました...私の状況では、二重引用符が二重引用符で囲まれたものに一致するようにしたいのですが、 '' GET/class/\ "notes \"。txt \ "'(最後のダブルqouteもエスケープされます)が起きたときに動作しません。つまり、外側の引用もエスケープされます。私はこのケースでは外二重引用符をエスケープする必要はありません...しかし、解決策を考え出すことができません....あなたはこれを修正することができますか分かりませんか?ありがとうございます –

0

が正常にRubularでこれをテスト済みありがとう:

\"GET \\\".*\\\"\"

内訳:
\」 - エスケープ "文字リテラルを意味し、正規表現文字列のための"
GET - あなただけGETしたいと仮定すると、これは明示的です
\\ " - エスケープ\と"リテラル文字列を取得\ "
* - \ 0以外の任意の文字の0以上
\\" \ " - エスケープするリテラル\ ""

+0

@andrewrockwellこんにちは、この作品は私の例ではありがとうございます。しかし、外側の二重引用符の中の '\"は、他の場所に置くことができます。たとえば、 '' GET/class/\ "notes \"。txt "'と答えてもらえません。 –

1

これは動作します:

/"(?<method>[A-Z]*)\s*\\\"(?<file>[^\\"]*)\\""/ 

Rubularでそれを参照してください。

編集:

"(?<method>[A-Z]*)\s(?<content>(\\\"|[a-z\/\.]*)*)" 

はそれhere参照してください。

編集2:(ルビー1.8.6用)なし(?...)シーケンス:

"([A-Z]*)\s((\\\"|[a-z\/\.]*)*)" 

Rubular here。これはあなたが尋ねたまさにん

/\A"((?<=\\)"|[^"])*"\z/

+0

ありがとうございました。あなたの答えをありがとうございます。しかし、行中の '\"がどこにでも出ることができるという質問があります。例えば、このGET/class/\ "notes \ "。txt" 'だから、これを行う方法があると思っているだけです。"二重引用符が二重引用符で囲まれていない場合は、 " –

+0

@AllanJiang、updated answerを参照してください。これはあなたが期待する行動ですか? – user2398029

+0

古いRubyバージョン用にもう一度更新されました。 – user2398029

0

正規表現が本当にあなたの最高のツールであるかどうかは確かではありませんが、使用することを強くお勧めする場合は、文字列をトークンの列として考えることをお勧めします。引用、次に\\\"または引用符ではないもの、最後に引用符を付けます。これは:

^"(\\\\|\\"|[^"])*"$