2009-05-05 8 views
0

いつものように、正規表現は私の頭を傷つけています。xaml binding-esque構文を解析するための正規表現

私は私が解析したいと思います(例として)以下の文字列を持っている:

Client: {Path=ClientName}, Balance: {Path=Balance, StringFormat='{0:0.00}'} 
Client: {Path=ClientName}, Balance: {Path=Balance, StringFormat='Your balance is {0:0.00}.'} 

私は次のように文字列を分割して、得ることができた正規表現(またはその他の方法)を探しています個々のキー/値の値私は、文字列を分割するには、次の正規表現を持っているが、これが原因「}」にStringFormatの値によって混乱してしまう瞬間

String 1: {Path=ClientName} 

    Path = ClientName 

String 2: {Path=Balance, StringFormat='{0:0.00}'} 

    Path = Balance 
    StringFormat = {0:0.00} 

を(アイデアが結合XAMLにこれらのそれぞれを解決することです)値で

(?<!'){(.+?)}(?!') 

これをどのように達成できますか?

ありがとうございます!

+0

正規表現は実際には本当にこの仕事に最適なツールではありません。正規表現で行う必要がある理由はありますか? –

+0

正直言って、私は正規表現を使って*できると思っていましたが、途中でそのトピックについて私の知らないことでした。私は本当に任意の提案にオープンです! –

+0

これは正規表現で行うことができますが、それは怠惰なハック解決策です。仕事のためのより良いツールがありますが、正規表現はたいていの場合、「十分に良い」ものになるでしょう。 –

答えて

1

は本当に何度もこの同じ問題を解決疲れるが、ここであなたが行くを取得 :

技術的に、あなたはそれが間違ってやっている、あなたはパーサを使用する必要があり、正規表現は、ネストされたに対処するために構築されていません括弧にマッチしています。私たちは一緒にこの1つをハックすることができます、なぜそうではありませんか?

/(?<!'){([^'}]|'[^']+')+}(?!')/ 

その肉 - - {([^'}]+|'[^']+')}は2つのことを探します。a)}または'文字([^'}])、および文字列('[^']+')のように見えるb)には何もありませんもの。これは、文字列が引用符であり、引用符で囲まれていないテキストと、別の引用符であると仮定しています。あなたの例を考えれば、これはうまくいくはずです。

ただし、エスケープされた引用符用に設計されていないため、'This is a string with \'quotes\' in it'と一致しません。これを追加するのは簡単で、適用した原則を適用するので、できるかどうかはわかります。あなたは正規表現ではかなり良いと思われます。あなたが尋ねる前に少なくともこれを始めたので、それを文字列に一致させる方法を考え出すことができると思います。

編集:"の代わりに'を使用しています。申し訳ありません。

+0

はい!ありがとう、それは動作するようです! –

+0

問題ありません。私はあなたが正規表現の理論的な限界に関するいくつかを読むことをお勧めします。正規表現は文字列を内側(つまり '\')の中で引用符で括ることができますが、括弧で囲まれた括弧({{} {}})は一致しません。解析したいテキストが(特にネストされた括弧の行に沿って)はるかに複雑になる場合、別の解決策を見つけるべきです。現代の正規表現はそれを行うことができますが、正しく書いたり、読んだり、維持したり、アップグレードしたりするのは、ハッキリで不必要に難しいものです。 –

関連する問題