2017-04-12 44 views
1
string Test = "SET @rhsLclGrpVar = CAST(@variable1 AS CHAR(3)) /*RHS: X(03)*/+ 
CAST(@variable2 AS CHAR(42)) /*RHS: X(42)*/+ CAST(@variable3 AS 
CHAR(8)) /*RHS: X(08)*/"; 

我想删除任何东西来字符串删除字符之间多次出现

"/*" and "*/" 

对于单occurence之间我有这样一段代码:

int startIndex = item.IndexOf("/*"); 
int endIndex = item.LastIndexOf("*/"); 
string Output = item.Replace(item.Substring(startIndex, endIndex - 
startIndex + 2), string.Empty)); 

这的情况下正常工作单一事件。

+2

还有其他选择..但是,为了简单起见,怎么样..一个while循环,并且它发现索引/ *继续? – BugFinder

+0

正如BugFinder所建议的那样:'int startIndex; while((startIndex = item.IndexOf(“/ *”)!= -1)' – xanatos

+0

感谢您的建议,但我一直在寻找比while循环更清洁的东西,原因是这个代码被嵌入在for循环中读取文件。它可能会变得混乱 –

回答

3

您可以使用一个正则表达式:

Regex rgx = new Regex(@"/\*.*?\*/"); 
string output = rgx.Replace(item,""); 

csharp交互式控制台运行此,我们得到:

csharp> using System.Text.RegularExpressions; 
csharp> string item = "SET @rhsLclGrpVar = CAST(@variable1 AS CHAR(3)) /*RHS: X(03)*/+ CAST(@variable2 AS CHAR(42)) /*RHS: X(42)*/+ CAST(@variable3 AS CHAR(8)) /*RHS: X(08)*/"; 
csharp> Regex rgx = new Regex(@"/\*.*?\*/");                                  
csharp> rgx.Replace(item,"");                                      
"SET @rhsLclGrpVar = CAST(@variable1 AS CHAR(3)) + CAST(@variable2 AS CHAR(42)) + CAST(@variable3 AS CHAR(8)) " 

正则表达式的工作原理如下:/\*部分简单地识别/*模式。接下来.*?匹配非贪婪任何字符序列,但会从匹配模式的下一部分即*/片段的那一刻开始截断。通过使用Replace我们将替换为所有与空字符串匹配的模式,因此我们将其删除。

使用IndexOf一个解决办法是:

string result = item; 
while(true) { 
    idx = result.indexof("/*"); 
    if(idx >= 0) { 
     idx2 = result.indexof("*/",idx); 
     if(idx2 >= 0) { 
      result = result.Substring(0,idx)+result.Substring(idx2+2); 
     } 
    } else { 
     break; 
    } 
} 

但是,这是相当复杂(有仍然有一些bug一定的几率),将可能是低效率的。

+0

虽然它是正确的,并且我赞成它,但我会讨厌任何试图在我附近编写正则表达式的人,而且我对正则表达式很满意:-) – xanatos

+0

@xanatos:我不是一个粉丝自己。寻找一个MySQL解析器并操纵出来的语法树通常会更好。例如,人们使用XML解析器进行XML操作。 –

+0

也许'@“/\*.*?\*/”'会更具可读性......但它似乎仍然是一种坏的ASCII艺术('/ \'和'\ * /') – xanatos