删除richtextbox中的某些单词
本文关键字:单词 richtextbox 删除 | 更新日期: 2023-09-27 18:28:42
我有RTB,文本如下:
2016-01-01T10:47:19Z Info {"message":"stopped establish worker"}
2016-01-01T10:47:19Z Info {"message":"stop establishing"}
2016-01-01T10:47:25Z Alert {"message":"DoStatusRequest failed for 188.166.29.241"]
我的问题是,什么代码可以使我的RTB只显示像这样的文本
stopped establish worker
stop establishing
DoStatusRequest failed for 188.166.29.241
我使用过这个代码,但什么也没发生。
List<string> finalLines = richTextBox1.Lines.ToList();
finalLines.RemoveAll(x => x.StartsWith("2016") && x.EndsWith("message'":'""));
richTextBox1.Lines = finalLines.ToArray();
代码中的两个错误是您的
-
假设
List.RemoveAll(Predicate<T>)
将删除字符串的部分。但它将完全删除符合条件的每一行。 -
您忘记在字符串匹配中包含结束卷曲,因此没有行匹配。
要解决这类任务,您有两种常见的方法可供选择:
- 使用
RegEx
- 使用字符串操作
在这种情况下,字符串操作很简单:
List<string > lines = richTextBox1.Lines.ToList();
lines = lines.Select(x => x.Substring(0, x.Length - 2)
.Substring(x.IndexOf("'":'"") + 3)).ToList();
richTextBox1.Lines = lines.ToArray();
但这是否足够灵活和安全将始终取决于数据的特性。
对于Regex
来说也是如此,但对于处理更动态的数据,或者对于可以使用它们的字符组或高级模式匹配的问题,尤其是当你不知道是否会有匹配以及匹配的次数时,这些功能可能非常强大
例如,上述解决方案对于不适合匹配字符串的行是不鲁棒的;这些不会在开始时被剪裁,但在结束时仍会被剪裁两个字符。。
为了使它更健壮,也许它将有助于使用循环而不是LINQ并添加一些检查。。
以下是如何使用RegEx:创建更健壮的表达式的两个示例
假设你想确保只清理以四位数字开头的行,你可以写:
string sNew = Regex.Replace(sOld, "[0-9]{4}.*'":'"", "");
这意味着删除以四位数字开头、以"":"
"结尾的所有字符(".*
",即任意次数的任何字符)。
要删除结尾的两个字符,您可以写:
string sNew = Regex.Replace(sOld, "..$" "");
这表示行或字符串的最后两个字符。
如果我们只想清理以撇号和卷曲结尾的行,我们可以写:
string sNew = Regex.Replace(sOld, "'"''}$" "");
$
再次表示"行或字符串的末尾"。还要注意,我们有两个级别的转义:我们必须转义C#
字符串中的撇号,并且必须转义其他字符,如RegEx
中的反斜杠和卷曲。。
强大的力量也会带来一定程度的复杂性。。这意味着在产品代码中RegExes需要额外精确和细致的文档!
最后一个例子:在你的问题中,最后一行以括号结尾,而不是花括号。可能是打字错误,但你可以包括这样的变体:
string sNew = Regex.Replace(sOld, "['"}'']]{2}$", "");
你能破译它吗?