2011-07-19 11 views
5

データベースに書き込むために、プロパティファイルからキーと値のペアを解析する正規表現が必要です。アプリケーションはjavaで書かれています。コメント行と空行に関する情報を保存する必要があるので、properties.loadは機能しません。エスケープされていない空白を含むキーと値のペアの正規表現

エスケープされていない空白や等号(エスケープされた空白を含む)が最初に出現するまではすべてです。 値は行末まではすべてですが、空にすることもできます。

それは、次の例と一致してい

  • キー=値を
  • キー値
  • key = valueの値
  • キー
  • キー値値
  • キー\キー\ key = value
  • キー\ key \ key値

私は、次の正規表現を試してみましたが、それは正しく、最後の2例を区切るません。

1. key\ 
2. key\ key value 

代わりの

:私はRubularに乗る最後の2つの例については

^(\\\s|[^\s=]+)+[\s|=](.*)?$ 

私もthisを試しましたが、それでも私にとっては役に立たない

ありがとうございました!

答えて

2

あなたは

あなたのスペースをチェックするとき、負の後読み (?<!\\\\)\sを使用したいです
^((.*?)((?<!\\\\)\\s|=)(.*?)|(\\w+))$ 

(.*?)    Match everything non greedy up to the next match 
((?<!\\\\)\\s|=) Match witespace not preceded by \\ 
(.*?)    Again match everything non greedy up to the next match 
|\\w+    Or match strings with no whitespace - this captures case 3 with no value 

でテストケースごとに、それを破壊ツールhttp://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

+0

うまく動作するようです。ヘルプと説明をありがとう! :) – Sebastian

+1

また、キーとグループを取得するためにグループ#1を使い続けるには '(。*?)(((?<!\\\\)\\ s | =)(。*?))? '値を取得する#4。 'Matcher.matches()'が文字列全体にマッチするので、文字列の開始/終了を実際に一致させる必要がなければ、それらを残すことができます。 –

+0

@ Dan-Cruz非常に素敵な簡素化 - あなた自身の答えとしてそれを追加し、それにいくらかのクレジットを与えるべきです。 – cordsen

0

試み(あなたはJava文字列としてそれを書くときにエスケープバックスラッシュに注意する必要がありますので、これはプレーンな正規表現であることを覚えている):

^(\\\s|[^\s=])+(.*)$ 
+0

この正規表現は、キーの最後の文字だけをキャプチャします。 – Sebastian

+0

あなたはいくつかのスラッシュを忘れました: '^(\\\\\ s | ....)'。 –

+0

@セバスチャン:はい、申し訳ありません私はここで、私の脳を使ってテストするツールがありません:) – LeleDumbo

関連する問題