2011-11-14 11 views
1

Iは、のパターンに短い文字列の束を持っている:正規表現またはスキャナ

<text @varible1 more text><, @variable2 text ><@variable3 text text> 

@variableNはプレースホルダであり、各ブラケットは、密閉varibaleが空の文字列である場合ことを示す「部」であります、 'セクション'は存在しません。私は正規表現を使用して各セクションを抽出し、対応する変数が空であるかどうかに基づいて文字列全体を再アセンブルすることを考えています。私は@変数1 =を渡す場合たとえば、「こんにちは」、文字列全体@ variabl3 =「世界は」のように返還しなければならない:

text hello more text, world text 

を最初に、私は多分、私が仕事を得るために十分な正規表現のトリックを使用すると考えていた時。そして、私は 'セクション'がおそらくネストできることを発見しました。そして、明らかに - '<'、 '>'、 '@'のようないくつかの特殊文字をエスケープする必要があります。私はそれについて考えるほど、DSLのように見えます。だから、スキャナを開発するほうがいいでしょうか?私はパーザを書くことについて少ししか知りません。だから私はちょっと立ち往生して、行く方法がわからない。

誰かがこの種のシナリオでの経験を持っている場合は、その上にいくつかの光を当ててください。ありがとう。

構文例

<text @varible1 more text><, @variable2 text ><@variable3 text text> 
<text @varible1 more text><, @variable2 <, @nestedVaraible> text \<@userName\> > # with nesting and escaping 
<text @varible1 more text><, @variable2 text ><@variable3 \@twitterAccount> # escaping‘@ 

JSLint

+0

あなたが使用している言語について言及すると、あなたに指示するのがより簡単になるかもしれません。誰かがおそらく既にあなたが使用できる設定可能なものを持っているでしょう。間違いなく私のパーサの問題のように聞こえる。 – fncomp

+0

PHPまたはPythonで問題ありません。 – Shawn

+0

Gotcha、あなたはあなたの構文の要点を得ることができるように、いくつかの行を投稿できますか?おそらく、私は[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/documentation.html)の適応を提案するつもりです。 – fncomp

答えて

1

あなたはこれにPHP正規表現を使うことができますが、パーサを書くというアイデアが開いていれば、時間を投資する方が良いと思います。ここで私はあなたのテキストに一致するように作ってみた最も単純な正規表現です:

$rgx = '~((?:[^<>\\\\]++|(?:\\\\.)++)++)|(<(?:(?1)|(?-1))*+>)~'; 

...としても、そのすべてが他のすべての対括弧の部分に文字列を分割です。そして、それはあるレベルでのみ行います。すべてのネストされたセクションを削除するまで、括弧で囲まれたセクションに再帰的に適用する必要があります。変数名を見つけることから始めて、他のすべての処理を行う必要はありません。正規表現は驚くほど強力ですが、さらに驚くべきことは、あなたが正規表現を作成するために脳全体を汗ばませた後に残した作業の量です。

Pythonの正規表現はそれほど強力ではありませんが、それはおそらく良いことですが、私のような正規表現を正規表現にするのは面倒です。 :Pそれは代わりにpyparsingです。私はそれを自分で使ったことはありませんが、それについて良いことを聞いています。それはあなたが必要とするものかもしれません。

2

あなたはこのような場合のために楽しいだろうと自分自身のパーサーを書くためにダウンしている場合は、私がDouglas Crockfordをチェックアウトしたいです」。彼はすべてのコードを掲示し、本当に良いコメントをいくつか持っています。

もう少し一般的には、私は間違いなくこの便利な質問をチェックしたいと思います:Writing a simple parser