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