Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除字符串中字符之间的多个匹配项_C#_.net - Fatal编程技术网

C# 删除字符串中字符之间的多个匹配项

C# 删除字符串中字符之间的多个匹配项,c#,.net,C#,.net,我想删除任何介于两者之间的内容 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

我想删除任何介于两者之间的内容

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));
csharp
交互式控制台中运行此命令时,我们会得到:

Regex rgx = new Regex(@"/\*.*?\*/");
string output = rgx.Replace(item,"");
正则表达式的工作原理如下:
/\*
部分只识别
/*
模式。接下来,
*?
匹配任何字符序列,但从匹配模式的下一部分时起,
\*/
*/
片段将被截断。通过使用
Replace
我们将该模式的所有匹配项替换为空字符串,从而将其删除

使用
IndexOf
的解决方案可以是:

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

但这相当复杂(仍有可能存在一些bug),效率可能会较低。

还有其他选择。。但是,为了简单起见,我们。。一个while循环,当它找到一个/*的索引时继续运行?正如BugFinder所建议的,类似于:
intstartindex;而((startIndex=item.IndexOf(“/*”)!=-1)
谢谢你的建议,但我一直在寻找比while循环更干净的东西。原因是这段代码嵌入了读取文件的for循环中。它可能会变得混乱。虽然它是正确的,而且我对它投了赞成票,但我会讨厌任何试图在我身边编写正则表达式的人,我对正则表达式也很在行:-)@xanatos:我自己也不是一个粉丝。通常最好是寻找MySQL解析器并操纵从中产生的语法树。例如,使用XML解析器进行XML操作。
@/\*.*?\*/“
可能更具可读性。。。但它似乎仍然是一件糟糕的ASCII艺术作品(《代码》)和《代码》*/《代码》)谢谢威廉。这个很好用。你能简单介绍一下你使用过的正则表达式吗?我只是想知道,如果没有正则表达式,它是否可以实现。也许用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;
    }
}