我覺得想拉這個時候你會發現too many edge cases用正則表達式關閉。處理報價是真正使事情複雜化的原因,更不用說轉義字符了。
程序性解決方案並不複雜,並且根據需要更快更容易修改。請注意,我不知道轉義字符應該是在你的榜樣是什麼,但你肯定會添加到算法...
string CodeSnippet = Resource1.CodeSnippet;
StringBuilder CleanCodeSnippet = new StringBuilder();
bool InsideQuotes = false;
bool InsideComment = false;
Console.WriteLine("BEFORE");
Console.WriteLine(CodeSnippet);
Console.WriteLine("");
for (int i = 0; i < CodeSnippet.Length; i++)
{
switch(CodeSnippet[i])
{
case '"' :
if (!InsideComment) InsideQuotes = !InsideQuotes;
break;
case '#' :
if (!InsideQuotes) InsideComment = true;
break;
case '\n' :
InsideComment = false;
break;
}
if (!InsideComment)
{
CleanCodeSnippet.Append(CodeSnippet[i]);
}
}
Console.WriteLine("AFTER");
Console.WriteLine(CleanCodeSnippet.ToString());
Console.WriteLine("");
這個例子條從CodeSnippet
的意見了。我以爲這就是你以後的樣子。
下面是輸出:
BEFORE
"\#" TEST #comment hello world
"ab" TEST #comment hello world
"ab" TEST #comment "hello world
"ab" + "ca" + TEST #comment
"\#" TEST
"ab" TEST
AFTER
"\#" TEST
"ab" TEST
"ab" TEST
"ab" + "ca" + TEST
"\#" TEST
"ab" TEST
正如我所說的,你可能需要轉義字符添加到該算法。但這是一個很好的起點。
你必須解析整個字符串,字符轉義和所有...僅供參考,它比它看起來更難**。 – Mehrdad
想象一下''\#「測試#」測試#評論hello world「 - 大概是從第二個'#'開始的評論 - 但你怎麼區分? –
@Damien - 評論開始於第三個#實際上。區分它的方法是評論總是在最後,因此從右到左解析它直到碰到第一個#是我的目標 – Icemanind