0

次の正規表現があります。

\b((.|\n)*)=((.|\n)*)new((.|\n)*)\(\)

ac# ソース コード文字列からオブジェクトの割り当てを検出するために使用されます。

このように:var a = new Person();

一致が1つしかない場合は正常に機能しますが、これを処理しようとすると:

var a = new Person();
var x = new WebClient();

次のように、1 つの一致のみを返します。{var a = new Person(); var x = new WebClient()}

両方の一致を抽出する必要があります。どうすればいいですか、私は正規表現に比較的慣れていないので、何をすべきかわかりません。

RegExr で正規表現をテストすると、正常に動作します (グローバル チェックボックスをオンにすると)。

4

3 に答える 3

1

\n は、改行に一致させることを許可しています。

これは、expresso のテスト データに対して機能します。

\b((.)*)=((.)*)new((.)*)\(\)

一致するグループ (括弧) が必要ない場合は、これもうまくいくようです:

\b.*=.*new.*\(\)

これは、 を使用するよりも適している可能性があります。(任意の文字)。

\b[\w\s]*=[\w\s]*new[\w\s]*\(\)

コードベースに正確なスペースがあると確信している場合 (たとえば、StyleCop などによって強制されている場合)、\w (単語文字) と \s (スペース文字) に関してさらに具体的にすることができます。

また、意図的かどうかはわかりませんが、 ; と一致していません。行の終わりに。

于 2013-01-31T13:36:06.950 に答える
1

この式から始めてください。正規表現自体で改行を処理しようとするのではなく、Multiline regex オプションを渡してみてください。

var src = @"var a = new Person();
var x = new WebClient();";
var pattern = @"(\w+\s*)(\w*\s*)=\s+new\s+(\w+)\(\)";
var expr = new System.Text.RegularExpressions.Regex(pattern,RegexOptions.Multiline);
foreach(Match match in expr.Matches(src) )
{
    var assignType = match.Groups[1].Value;
    var id = match.Groups[2].Value;
    var objType = match.Groups[3].Value;        
}

そうは言っても、C# の解析を処理するための RegEx よりも (はるかに) 優れたツールがあります。それらに興味はありますか?

于 2013-01-31T13:36:10.943 に答える
1

名前付きグループを使用できます。パターンを次のように変更すると、名前が付けられたグループasgnが割り当て全体に一致します。

(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)

名前付きグループにアクセスする方法は次のとおりです。

string pat = @"(?<asgn>\b\w+\s+\w+\s*\=\s*new\s+\w+\([^)]*\)\s*;)";
string input = @"var a = new Person();
                var x = new WebClient();";
foreach (Match m in Regex.Matches(input, pat))
{
    Console.WriteLine(m.Groups["asgn"].Value);
}

割り当ての各部分を解析して抽出する必要がある場合は、次のように、さらにグループに名前を付けてパターンに含めることができます。

(?<asgn>\b(?<vtype>\w+)\s+(?<name>\w+)\s*\=\s*new\s+(?<type>\w+)\((?<args>[^)]*)\)\s*;)

一致した文字列から変数の型、変数名、型、およびコンストラクターの引数を抽出できます。

于 2013-01-31T13:39:29.050 に答える