删除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();

删除richtextbox中的某些单词

代码中的两个错误是您的

  • 假设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}$", "");

你能破译它吗?