我的RTB有这个文字:
http://localhost/Project/index.php/rest/resource/cars/2
我的问题是,什么代码可以使我的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"]
我使用过此代码,但没有任何反应。
stopped establish worker
stop establishing
DoStatusRequest failed for 188.166.29.241
答案 0 :(得分:2)
代码中的两个错误是您
假设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
来说也是如此,但这些对于处理更多动态数据或者您可以使用其角色组或高级模式匹配的问题非常有用,尤其是当您不# 39;不知道是否会有多少场比赛。
上述解决方案例如对于不适合匹配字符串的行不具有鲁棒性;那些不会在开始时被裁剪,但最后仍会被两个字符修剪..
为了使它更强大,也许它可以帮助进行循环而不是LINQ并添加一些检查..
以下是如何使用RegEx创建更强大的表达式的两个示例:
假设您想确保只清理以四位数字开头的行:
string sNew = Regex.Replace(sOld, "[0-9]{4}.*\":\"", "");
这意味着删除所有内容(&#39; .*
&#39;,即任意次数的任何字符)以四位数字开头并以&#39; ":"
&#结尾39;
要删除您可以写的结尾两个字符:
string sNew = Regex.Replace(sOld, "..$" "");
这意味着该行或字符串的最后两个字符。
如果我们只想清除以撇号和卷曲结尾的行,我们可以写:
string sNew = Regex.Replace(sOld, "\"\\}$" "");
$
再次表示该行或字符串的结尾&#39;。还要注意我们如何有两个级别的转义:我们必须在C#
字符串中转义撇号,我们必须转义其他字符,如反斜杠和RegEx
内的卷曲。
强大的功能也带来了一定程度的复杂性。这意味着在产品代码中,RegExes需要额外的精确和细致的文档!
最后的例子:在你的问题中,你的最后一行以括号结尾而不是卷曲。可能是一个错字,但你可以包括这样的变体:
string sNew = Regex.Replace(sOld, "[\"}\\]]{2}$", "");
你可以破译它吗?