2011-09-14 14 views
2

は私が..乳液やHTMLファイル内に多くの正規表現をしなければならないと、多くの場合、私は次のような状況で私の自己を見つける:正規表現:スタックで非貪欲?

私は\mbox{\sqrt{2}} + \sqrt{4}のようなものが\sqrt{2} + \sqrt{4}ストリッピングすることにしたいです。すなわち :「、だから、その内容によって

をの\ mbox形式{...}のすべての発生を置き換える私は

貪欲バージョン\mbox{(.*)}私に$ 1 \sqrt{2}} + \sqrt{4と非 を取得することをどのように行うのですか?は、貪欲なバージョン\mbox{(.*?)}は私に$ 1 \sqrt{2を取得します。

どちらも私が欲しいものではありません。私は必要なもの

は、正規表現エンジンは何とか前の位置にあることとBEH文字の スタックを保持していること、ですind (.*)、すなわち{}です。したがって、.*に新しい{が出現した場合は、スタックに配置する必要があります。 }が発生した場合は、最後の{をスタックから削除する必要があります。スタックが空の場合、.*が実行されます。

同様のケースがネストされたHTMLタグで発生します。

大部分の正規表現エンジンは正規表現ごとにFSAを作成するので、スタックが実行可能である必要がありますか、何か迷っていますか?私が気づいていない珍しい修飾語?私は不思議に思っています、なぜこれのための解決策がありません。

私は一切のJava/Pythonの/ Perlで私の自己のために何かをコーディングすることができもちろん

..しかし、私はそれが

よろしく:)正規表現に統合したいのですが、ギルバート

(PS:私は、 )\があまりにもエスケープする必要があり、小さな例を維持するために

+0

これは標準的な正規表現では不可能です。ネスティングの任意の深さは通常の言語では表現できません。 (FSAの** F **を考えてみてください) –

+0

ねえ、良い点。何とか満足していない。私はこれが共通の問題だと思っていたので、解決策がいくつかあります。 – Gilbert

+1

確かに。その解決策は、正規表現よりも広い範囲の文法に対応できるパーサーを使用することです。 –

答えて

2

+ \sqrt{4}を投影する省いそれはあなたの正規表現エンジンに依存するが、以下のように、それは、.NET正規表現エンジンで可能です...

\\mbox{(
    (?> 
     [^{}]+ 
     | { (?<number>) 
     | } (?<-number>) 
    )* 
    (?(number)(?!)) 
) 
} 

あなたは、あなたが

+0

私はOPが.NET regexesを使用していないと確信していますが、とにかく+1です。 ;) –

+0

ありがとう、少なくとも有望そうです:) VisualStudioやExpression WebのようなMS編集者がこの種類のRegExをサポートしているのであれば、ご存知ですか? (どちらも.NETに依存しているかどうかはわかりません) – Gilbert

+0

私はそうは思わないが、[Expresso](http://www.ultrapico.com/Expresso.htm)を使用してあなたの正規表現を置き換える –

1

を望んだの変換は、ここではperlのhttp://codepad.org/fcVz9Bkyで動作し、別の正規表現です実行するregex.Replace(sourceText,"$1")を行うことができますIgnorePatternWhiteSpace

を使用していると仮定すると:

s/ 
\\mbox{ 
    (
    (?: 
     [^{}]+  #either match any number of non-braces 
     |   #or 
     \{[^{}]+} #braces surrounding non-braces 
    )* 
) 
} 
/$1/x; 

注:これはのみのために働きます1つのレベルの入れ子

1

あなたが使用できる別のトリックは再帰的なregですEX(PCREおよびその他のいくつかのフレーバーによってサポートされる必要があります):説明するの

\\mbox(\{([^{}]|(?1)+)*+\}) 

も過言ではない、あなたの心の右側の状態にしています。
ここで(たとえば、簡単[]()、または他の平衡構造を追加する)同様のものだが、もう少し柔軟:

\\mbox\{([^{}]|\{(?1)*\})*\} 
+0

私は再び私のコメントを指したいと思う。それだけです。 3番目のオプションはインラインコードですが、通常は不正です。 – Kobi

関連する問題