2016-05-01 40 views
0

首先,我很難與正則表達式。道歉前面如果這是很容易的,我只是想念它:(C#正則表達式找到組缺少一個字符串?

好吧,所以我們說我正在尋找解析我的源代碼,並找到我所有的私人功能。此外,讓我們說我想得到的代碼,整個塊,所以我可以檢查它

正則表達式匹配:。

Private Function[\s\S]*?End Function 

的偉大工程

現在,如果我想找到失蹤退回所有功能什麼聲明?我似乎無法找出這一個(見上面的re:正則表達式,我不知道相處得很好)。

任何人都指着我在正確的方向嗎?我正在使用正則表達式的.NET實現,如果這很重要(似乎 - 我發現似乎沒有任何Java示例工作!)

我正在使用regexstorm.net進行測試,如果它很重要:)謝謝!

+0

爲什麼你不使用你的上面的正則表達式,然後foreach匹配,檢查捕獲的字符串是否包含'return'?這將非常準確,非常容易。 – Jonesopolis

回答

0

看起來您可能正在分析Visual Basic。您可以使用微軟的代碼分析工具(Roslyn)來解析代碼並分析不同的部分。這將防止必須查找不同代碼文件的不同語法接受度。以下示例代碼將確定Function是私有的還是具有as子句。

string code = @" 
    Function MyFunction() 
    End Function 

    Private Function MyPrivateFunction() 
    End Function 

    Function WithAsClause() As Integer 
    End Function 
    "; 

// Parse the code file. 
var tree = VisualBasicSyntaxTree.ParseText(code); 

var root = tree.GetCompilationUnitRoot(); 

// Find all functions in the code file. 
var nodes = root.DescendantNodes() 
    .Where(n => n.Kind() == SyntaxKind.FunctionBlock) 
    .Cast<MethodBlockSyntax>(); 

foreach (var node in nodes) 
{ 
    // Analyze the data for the function. 
    var functionName = node.SubOrFunctionStatement.Identifier.GetIdentifierText(); 
    bool isPrivate = node.BlockStatement.Modifiers.Any(m => m.Kind() == SyntaxKind.PrivateKeyword); 
    var asClause = node.SubOrFunctionStatement.AsClause; 
    bool hasAsClause = asClause != null; 

    Console.WriteLine($"{functionName}\t{isPrivate}\t{hasAsClause}"); 
} 
+0

好的......那就是冷靜,我不會說謊。謝謝,我甚至都不知道這件事存在! – John

+0

根據您的項目要求,您也可以使用相同的框架自動更新代碼。 – joncloud

相關問題