2

だから私はこの形式のテキストを含むファイルを解析しようとしています:

outerkey = (innerkey = innervalue)

より複雑になります。これは、ファイルでも有効です。

outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))

したがって、基本的には外部キーのテキストのみをキャプチャしたいと考えています。すべてのテキストが 1 行に収まるとは限りません。値が複数の行にある可能性があります。また、ファイルには複数の項目があります。

これまでの私の正規表現は次のとおりです。

[^\s=]+\s*=\s*(\(\s*.*\s*\))

目標は、最初の部分[^\s=]+を検索したいキーに置き換えるだけで、外側の括弧のテキスト全体を取得することです。

これが問題です。私の正規表現は、キャプチャしたいテキストをキャプチャするだけでなく、正規表現は貪欲であるため、次のグループからのテキストもキャプチャします。最初の閉じ括弧でキャプチャを停止するため、欲張らないようにしても機能しません。

最終的に、次の文字列がある場合

foo = 
(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

グループを一致させたい

(
  ifoo = ifoov
)

(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

今なら合うよ

(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

ちなみに、私はこれを複数行および単一行モードで実行しています。

何か案は?ありがとう!

4

2 に答える 2

3

次のように、この問題に対してバランシング グループ定義の.NET 正規表現機能を適応させることができました。

Regex r = new Regex(@"(?x) # for sanity!

    (?'Key' [^=\s]* )
    \s*=\s*
    (?'Value'
      (
         (
           [^()]*
           (?'Open'\()
         )+
         (
           [^()]*
           (?'Close-Open'\))
         )+
      )+?
    )
    (?(Open)(?!))

");

次に、次のようにテストできます。

var text = @"
foo = 
(
  ifoo = ifoov
)

bar =
(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)

outerkey = (innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))
";

foreach (Match m in r.Matches(text)) {
  Console.WriteLine("Key: [{0}]", m.Groups["Key"]);
  Console.WriteLine("Value: [{0}]", m.Groups["Value"]);
  Console.WriteLine("-------");
}
Console.WriteLine("That's all folks!");

これは出力します ( ideone.com で見られるように):

Key: [foo]
Value: [(
  ifoo = ifoov
)]
-------
Key: [bar]
Value: [(
  ibar =
    (iibar = iibarv)
    (iibar2 = iibarv2)
)]
-------
Key: [outerkey]
Value: [(innerkey = (twodeepkey = twodeepvalue)(twodeepkey2 = twodeepvalue2))]
-------
That's all folks!

ドキュメントのパターン例からのいくつかのマイナーな変更は次のとおりです。

  • 開き - 閉じ - どちらでもないブラケットは、\(- \)-[^()]ではなく<- >-になりました。[^<>]
  • +?バランスの取れた構造は、代わりに (少なくとも 1 つ、しかしできるだけ少ない) で繰り返されます。*
  • 「コンテンツ」は括弧の後ではなく前に一致します
于 2010-08-12T15:02:46.100 に答える
2

一般的に、正規表現は一致をカウントできないため、これを実現するのは簡単ではありません。ただし、.NETには「グループ定義のバランス調整」と呼ばれる機能があります。ここでの例は、ペアの山かっこを一致させる方法を示しており、そこに到達するはずです...

于 2010-08-12T15:14:07.530 に答える