2009-05-26 17 views
0

いくつかのビジネスルールに基づいてコード内のswitch/caseステートメントを識別して処理する必要があります。
スイッチケースステートメントと一致する正規表現パターン

典型的なswitch文:私は第二段階の最初のステップとケースのラベルとボディにスイッチ本体を一致させるために、2つのパターンを作成することができた

switch (a)
{
case "A":
case "B":
result = "T";
result1 = "F";
default: result = "F";
}

、しかし私はケースラベルとボディを抽出することができる単一の正規表現を探しています。

ネストされたスイッチはありません。

敬具、

+0

ケースに条件文やループが含まれていますか?文字列内であっても、問題が発生します。実際にパーサーを使用する方法はありません。 –

答えて

3

switch文は(一体、{}を入れ子にすることができることをしても、実際にはそれらを壊す)伝統的な正規表現はそれらを扱うことができない入れ子にすることができますので。 RegexesはRegular Languagesのみ解析できます。規則的でない言語を解析するには、何らかの構文解析プログラムが必要です。あなたが持っている言語(C言語に似ていますが、多くのことがそうである)に応じて、既に使用できるパーサがあるかもしれません(例えば、CではSparse)。

+0

こんにちは ネストされたスイッチはありません。 –

1

ここから始めてはいますが、完全ではありません。式では、デフォルトとswitch文の末尾が認識されません(その他のエラーも含まれます)。

(?sn:(case (?<label>[^:]+):[ \r\n\t]*)+(?<body>((?!case).)*)) 

UPDATE

体が文字列または識別子の一部としてcase含まれている場合にも失敗します。

0

Chas。 Owensは彼のコメントで正しいです。しかし、単純な場合のために、あなたは多分、次の正規表現を使用することができます

switch\s*\((?<expression>[^\)]+)\)\s*\{\s*((default(?<case>)|case\s*(?<case>"[^"]*"|'[^']*'|\w+))\s*:\s*(?<body>((?!\s*(case\b|default\b|\}))("[^"]*"|'[^']*'|[^\}]))*)\s*)+\} 

がそれを使用するには、あなたが(例えば、.NETの正規表現エンジンなど)の明示的な複数の名前付きキャプチャとルック先読みをサポートする必要があります使用している正規表現エンジン。名前付きグループ以外のすべてのグループは非キャプチャにすることができますが、正規表現を理解しやすくするために、グループ開始時に "?:"を追加して非キャプチャグループにしませんでした。

あなたは、次のキャプチャで認識された各switch文の1試合を取得します:

  • の式:スイッチのために使用される式(1つのキャプチャ)

  • ケース:ケースのラベルを、または空の場合(ただしキャプチャに成功)

  • 本文:ケースごとに1つずつ

大文字と小文字は常にペアになり、キャプチャを列挙できます。

関連する問題