0

こんにちは、この質問が何度も出されていることを知っています。正規表現を使用して繰り返し式を見つけるために SO の誰かが提案したのと同じ方法を使用しましたが、正しく機能しません。次のようなパターン ファイルがあり、正規表現を使用して Java で解析する必要があります。

[Abc]
var1 = "val1"
var2 = val2 
[Def]
var1 = "\[val1\]" 
var2 = 1;
var3 = val3
[Xyz]
var1 = val1 

(\[([^\\]*?)\])(.|\s)*?ファイル内のブロックを見つけるために正規表現を使用しています。角括弧の開始から次の括弧の開始までのブロックを検討しています。正規表現の惑星でこの正規表現を試してみると、うまくいきません。指定されたファイルと一致しますが、最初の角括弧の終わりから次の角括弧の始まりまでのブロックである必要がある group(3) が null であることがわかります。この正規表現も使用してみまし(\[([^\\]+?)\]\s*$\s*(([^=]*)\s*=\s*([^$]*)\s*$)*?)たが、これも機能しません。値のペア番号を 4 に固定して正規表現を使用しようとすると(\[(.+?)\]\s*?(.+?)\s*?=\s*?(.+?)\s*?(.+?)\s*?=\s*?(.+?)\s*?(.+?)\s*?=\s*?(.+?)\s*?(.+?)\s*?=\s*?(.+?)\n\s*?)、うまくいきました。可変ケースで機能しない理由。

上記のブロックの例でブロックを抽出できる場合は、両方が必要です

var1 = "val1"
var2 = val2

または直接抽出する

var1 , "val1" var2 val2

これで質問が明確になることを願っています。

4

1 に答える 1

1

前向きな先読みを使用する必要があります。次のブロックの開始を見つける必要がありますが、それをキャッチする必要はありません。

何かに沿って

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

説明:

  • (\[([^\\]*?)\])- ブロック定義: [sdgsdg]
  • ((.*\s)*?)- ブロックの内容。線ですが、貪欲ではありません。
  • (?=(\[[^\\]*\])|$)-前向きな見方。別のブロックの開始、または文字列の終了。
于 2012-09-19T11:18:02.630 に答える