1

有一点切弦问题。我有一个这样的字符串:

@VAR;Variable=Deteministic;Value=mostly;Note=Unless Slave is already in use;Op==;@ENDVAR;

Note 对我来说不是必需的,所以我想删除以 Note 开头的所有内容,直到下一个分号。Replace-Method 会很好,但我不知道如何在 Note 之后获取 Chars。

我试过这样的事情:

 int index1 = rs.IndexOf("Note=");
 int index2 = rs.IndexOf(';', index1+1);
 rs = rs.Remove(index1, index2);

我认为这应该足够了,但是如果没有注释并且我的程序弹出错误,它将失败。正则表达式是一种选择,但我想不出适合这里的一个。

请注意,该示例只是一个示例。我不知道输入字符串的样子。一行可以包含两个注释,而另一行可以没有。请在您的回答中考虑这一点。

4

6 回答 6

7

正则表达式确实可以在这里提供帮助:

rs = Regex.Replace(s, "(?<=;)Note=.*?;", "");

让我解释一下它更晦涩的部分:

  • (?<=;)确保Note前面有一个分号。但是,该分号不是替换的一部分。(这是一个积极的后视断言)。

  • .*?;匹配直到分号的所有字符,但非贪婪。这确保了Note=A;x=B;仅匹配到第一个分号并x=B保留。

于 2013-09-19T09:01:36.257 回答
2

这篇文章的大多数其他正则表达式答案确实有效,但它可能适合非正则表达式答案,只是为了表明除了锤子还有其他可用的工具:)

我假设您只想忽略所有以Note=

string input = "@VAR;Variable=Deteministic;Value=mostly;Note=Unless Slave is already in use;Op==;@ENDVAR;";

// Entries will contain all entries except those starting with 'Note='
string[] entries = input.Split(';').Where(s => !s.StartsWith("Note=")).ToArray();
// If you want to, you can put it all back together without the Note entries
string output = String.Join(";", entries);

// Ouput: @VAR;Variable=Deteministic;Value=mostly;Op==;@ENDVAR;
Console.WriteLine(output);

// Output:
// @VAR
// Variable=Deteministic
// Value=mostly
// Op==
// @ENDVAR
foreach (var entry in entries)
    Console.WriteLine(entry);
于 2013-09-19T09:10:51.663 回答
1

你是这个意思 ?

var regex = new Regex(@"Note.*?;");      
var ouput = regex.Replace(input, "");
于 2013-09-19T09:01:08.507 回答
1

第一次使用StringBuilder。这样做效率更高string。然后,如果您想保留原始想法:

 int index1 = -1;

while( (index1 = sb.IndexOf("Note=")) >=0)
{
   int index2 = rs.IndexOf(';', index1+1);
   rs = rs.Remove(index1, index2);
}
于 2013-09-19T09:01:52.063 回答
1

您可以使用正则表达式:

Note[^;]+;?

有点像:

rs = Regex.Replace(rs, @"\bNote[^;]+;?", "");

\b匹配单词边界。

[^;]匹配任何不是分号的字符。

于 2013-09-19T09:02:26.270 回答
0

您的代码应如下所示

int index1 = rs.IndexOf(";Note=");
while(index1 > -1)
{
    int index2 = rs.IndexOf(';', index1 + 1);
    rs = rs.Remove(index1, index2);
    index1 = rs.IndexOf(";Note=");
}
于 2013-09-19T09:02:21.200 回答