2011-12-04 7 views
0

私は、Scalaパーサーコンビネータを使用するための簡単なWikiライクなマークアップパーサーを実装したいと考えています。RegexとParserコンビネータでネスティッドマークアップを制限する方法は?

私は少しずつこの問題を解決したいと思いますので、最初のバージョンでは達成したいことがあります:単純なインラインリテラルマークアップです。

例えば、入力文字列がある場合:

This is a sytax test ``code here`` . Hello ``World`` 

出力文字列は次のようになります。

This is a sytax test <code>code here</code> . Hello <code>World</code> 

は、私がここにRegexParsersを使用してこれを解決しよう、と私はやりましたさ現在:

このコードでは、<code>マークアップは、たとえば、正常に動作します:

This is a sytax test ``code here``. 

This is a sytax test <code>code here</code>. 

になるしかし、私は上記の例でそれを実行すると、それは

This is a sytax test <code>code here`` . Hello ``World</code> 

をもたらすであろう、私はこれが原因で正規表現Iだと思います使用:

"""\B``(.)*``\B""".r 

``ペア内の任意の文字を許可しました。

私はそこに制限する必要があることを知りたいと思いますが、``をネストしてこの問題を修正できませんでしたか?

答えて

2

ここでは、非貪欲マッチングに関するいくつかのドキュメントです:

http://www.exampledepot.com/egs/java.util.regex/Greedy.html

基本的にそれは `最初に始めていますが`と一致するマッチを得るためにできる限り行こうとしている。

?あなたの*の後に、最長の試合ではなく、可能な限り最短の試合をするように指示します。

もう一つの選択肢は、[^ `] *(何かEXCEPT`)を使うことです。これにより、強制的に早く停止します。

0

いくつかの試行錯誤の後、私は次の正規表現は、仕事と思われるが見つかりました:

"""``(.)*?``""" 
0

私は正規表現のパーサについて多くを知らないが、あなたは、単純な1-ライナーを使用することができます

def addTags(s: String) = 
    """(``.*?``)""".r replaceAllIn (
        s, m => "<code>" + m.group(0).replace("``", "") + "</code>") 

テスト:

scala> addTags("This is a sytax test ``code here`` . Hello ``World``") 
res0: String = This is a sytax test <code>code here</code> . Hello <code>World</code> 
関連する問題