4

次のデータがあります。

int  time="1356280261"
char value="3000"

bankLine {
  char value="3000"
  char currency="EUR"
  int  time="1356280261"
} #bankLine

私はこのデータを再帰的に解析しており、ブロック外の 2 つの変数のみを個別に一致させたいと考えています

変数に一致するこの正規表現があります

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/

ただし、正規表現はブロック内のすべての出現にも一致します。

最初の 2 つの変数のみを個別に一致させ、bankLink ブロック内のすべてを無視するにはどうすればよいですか?

4

3 に答える 3

4

少しハックですが、次のようにネガティブな先読みを追加してみることができます。

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"(?![^{]*\})/
                                        ^^^^^^^^^^^

これは、すべての中括弧のバランスが取れていることを前提としています。幸い、括弧の外側のケースを探しているので、ネストは重要ではありません(通常は同様の質問でそうなります)。

先読みは、この観察に基づいています。オープンブレースに遭遇せずにクローズブレースに遭遇した場合、私たちは中括弧内にいると合理的に想定する可能性があります。

これを別の方法で拡張してネガティブルックビハインドを含めることもできますが、残念ながら、ほとんどの実装は可変長ルックビハインドをサポートしていません。

編集:

以下のコメントで説明されているように、これらの修正が推奨されます。

/(?:char|int)\s*([A-Za-z0-9]*)\s*=\s*"([^"]*)"(?![^{]*\})/
                    ^^^                ^^^^^
于 2012-12-25T15:54:16.627 に答える
0

このようなものがあなたのために働くかどうか見てください:

^(?:char|int)[^\n\r]*?$

^または、表現の前に置くだけです

于 2012-12-25T15:58:18.980 に答える
0

これは最善の解決策ではないかもしれませんが、これはあなたのケースでうまくいくと思います:

/^(int|char).*$/

これは、宣言が bankLine ブロック内でインデントされているためです。それが私たちがここで利用しているものです。先頭にスペースがない int または char で始まるすべての行を単純に一致させます。

于 2012-12-25T16:28:27.620 に答える