删除字符串中字符之间的多次出现

Remove multiple occurrences between characters in string

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 "*/"

对于单次出现,我有这样的代码:

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

这在单次出现的情况下工作正常。

您可以为此使用正则表达式:

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)) " 

正则表达式的工作原理如下:/\* 部分简单地识别 /* 模式。接下来 .*? 匹配 non-greedy 任何字符序列,但是从它匹配模式的下一部分 \*/ 的那一刻起就会被切断是 */ 片段。通过使用 Replace,我们用空字符串替换了该模式的 all 匹配项,因此我们将其删除。

使用 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;
    }
}

但这相当复杂(仍有可能存在一些错误)并且效率可能较低。