2009-06-16 8 views
0

Javaプロパティー・フォーマットでプロパティーを含むconfig.propertiesファイルがあります。 プロパティの値を、既知の名前で新しい値に置き換える必要があります。ファイルのコメントと書式を保存する必要があります。RegExを使用してプロパティ値を置き換えます

現在のところ、RegExを使用してプロパティ名を照合し、その値を置き換える方法があります。しかし、Java Propertiesは複数行の値をサポートしています。

ここは例です。私は「3」で、プロパティAの値を交換したいと思います

# A property 
A = 1\ 
    2 

# B property 
B = 2 

:と仮定config.propertiesには、以下のテキストが含まれています。最終結果は次のようになります。

# A property 
A = 3 

# B property 
B = 2 

現在のRegEx (?s)(A[\\s]*=[\\s]*)(.*)は正しく機能しません。

RegExを提案するか、これを行う方法が異なります。

ありがとうございます!

答えて

1

これを試してみてください:

String regex = "(?m)^(A\\s*+=\\s*+)" 
    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$"; 

私はあなたがそれを書いたときに最初の部分を残しましたので、値のマッチングに集中することができました。キーとセパレータを管理する規則は、実際にはそれよりはるかに複雑です。

値は、キャリッジリターン、ラインフィードまたはバックスラッシュを除くすべての文字、またはバックスラッシュとそれに続くライン区切り文字または任意の1つの非ライン区切り文字で構成されます。 DOS/Windows(\r\n)、Unix/Linux/OSX(\n)、またはOSX Mac(\r)の3つの形式のいずれかを使用できます。

正規表現はマルチラインモードであるため、ラインアンカーは機能しますが、ではなく、シングルライン(DOTALL)モードです。私はバックトラックが決して役に立たないことを知っているので、全体的に量的な量を使用しました。

1

プロパティファイルの読み込み、変更、保存を行うためのツールがJavaに用意されています。

個人的にはJakarta Commons Configurationが好きです。

+0

これははるかに良いアプローチです。 – slipset

+0

必要に応じてコメントと書式をそのまま維持しますか? –

0

私は、streetpcとJakarta Commons Configurationを使用することに同意します。

しかし正規表現に焦点を当てるには、ほとんどの正規表現エンジンがデフォルトで行単位で動作するという問題があります。 (かなり古い)Perl5Utilクラスで例えば

http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.htmlを参照)を使用すると、パターン構文を以下していることを読むことができます:

[m]/pattern/[i][m][s][x] 

メートルのプレフィックスは省略可能です。後ろのオプションの意味は次のとおりです。

 
i case insensitive match 
m treat the input as consisting of multiple lines 
s treat the input as consisting of a single line 
x enable extended expression syntax incorporating whitespace and comments 
+0

/m修飾子と/ s修飾子の名前が誤っています。彼らがするのは、 '^'、 '$'、 '。'の動作を変更することだけです。メタキャラクター正規表現をファイル全体に適用するか、一度に1行に適用するかは、あなた次第です。 –

関連する問題