有一点Stringcutting问题。我有一个这样的字符串:
@VAR;Variable=Deteministic;Value=mostly;Note=Unless Slave is already in use;Op==;@ENDVAR;
注意对我来说不是必需的,所以我想删除所有以Note开头的内容,直到下一个分号。替换方法会很好,但我不知道如何在Note之后获得Chars。
我试过这样的事情:
int index1 = rs.IndexOf("Note=");
int index2 = rs.IndexOf(';', index1+1);
rs = rs.Remove(index1, index2);
我认为这应该足够了,但是如果没有注释就会失败并且我的程序会弹出错误。正则表达式是一个选择,但我不能想到这里适合的一个。
请注意,这个例子只是一个样本。我不知道输入字符串是什么样的。一行可以包含两个Notes,另一行可以没有。请在答案中考虑这一点。
答案 0 :(得分:7)
正则表达式确实可以帮到这里:
rs = Regex.Replace(s, "(?<=;)Note=.*?;", "");
让我解释一下比较模糊的部分:
(?<=;)
确保Note
前面有分号。但是,该分号不是替代品的一部分。 (那是positive look-behind assertion)。
.*?;
匹配分号前的所有字符,但非贪婪。这样可确保Note=A;x=B;
仅匹配第一个分号并保留x=B
。
答案 1 :(得分: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);
答案 2 :(得分:1)
你是说这个?
var regex = new Regex(@"Note.*?;");
var ouput = regex.Replace(input, "");
答案 3 :(得分:1)
首先使用StringBuilder
。 string
效率更高。然后,如果你想保留原始想法:
int index1 = -1;
while( (index1 = sb.IndexOf("Note=")) >=0)
{
int index2 = rs.IndexOf(';', index1+1);
rs = rs.Remove(index1, index2);
}
答案 4 :(得分:1)
您可以使用正则表达式:
Note[^;]+;?
有点像:
rs = Regex.Replace(rs, @"\bNote[^;]+;?", "");
\b
匹配字边界。
[^;]
匹配任何不是分号的字符。
答案 5 :(得分:0)
您的代码应如下所示
int index1 = rs.IndexOf(";Note=");
while(index1 > -1)
{
int index2 = rs.IndexOf(';', index1 + 1);
rs = rs.Remove(index1, index2);
index1 = rs.IndexOf(";Note=");
}