2012-12-12 19 views
5

非常に単純なスクリプトパーサーを学校プロジェクトの一部として作成する必要はありませんが、正規表現でのみ行うことができるのは不思議です。Regex、引用符で囲まれているパターンを無視する

構文はASPと似ていますが、スクリプトは<%で始まり%>で終わります。

これはechoまたはResponse.Writeと同じ1つのコマンド "pr"のみをサポートしています。

今私は、スクリプトブロックを見つけるために、この正規表現を使用しています:

(<%\s*([\s\S]*?)\s*%>) 

しかし、私はこのようなコマンドがある場合:

<% pr "%>"; %> 

を...それは明らかにのみ一致した:

<% pr "%> 

引用符内にある終了タグを純正正規表現で無視する方法はありますか?私の主な心配は、引用符の間にあるタグに一致するかもしれないが、実際にはそれらが意味を成すならば、それらのタグの外側にあるかもしれないということです。たとえば...

<% pr "hello world"; %> " 

技術的には終了タグは、引用符で囲まれているが、それは他の方法で回避ではなく、「開く」、次に「クローズ」の引用、内部ではありません。

これは正規表現ではきちんとしているはずですが、そうでなければ私はこの機能をサポートしたいと思っていましたが、手作業で入力テキストを繰り返してブロックをパースしなければならないどちらか。

ありがとうございます!

+0

しばらく

"#foo# #bar#".matches(/#(.*)#/).group(1) // will return ["foo# #bar"] 

あなたの引用符が一致しない場合には、それは不可能です。たとえば、あなたの最後の例を '' <%pr "hello world";%> "'に拡張するべきではありません。引用符の内側にも外側にも '<%' and '%>'はありませんか?あなたの最後の例では、後の '' 'が後で入力にマッチすることを保証できますか? –

答えて

3

私はこれがあなたのニーズに合っていると思います:<%(".*?"|.*?)*?%>Demo参照)。

説明:

できるだけ長くマッチ.*ながら.*?マッチ可能限り小さな。 (擬似コードを使用して)例えば

"#foo# #bar#".matches(/#(.*?)#/).group(1) // will return ["foo", "bar"] 
+1

これはかなりうまくいきます!私は新しい行の文字を追加し、必要なキャプチャグループを追加するため少しマッサージしました。素晴らしい仕事。 – ARW

関連する問題