删除两个标签之间的文本

时间:2015-12-28 01:57:10

标签: regex vb.net

我试图删除两个标签之间的某些文字[& ]

[13:00:00]

我想从[]标签中删除13:00:00。 这个数字随时都不一样。 它总是一天中的时间,只有整数和:符号。

有人可以帮助我吗?

更新 我忘了说些什么。从日志文件中选取时间(13:00:00)。看起来像这样:

[10:56:49] [Client thread/ERROR]: Item entity 26367127 has no item?!
[10:57:25]  [Dbutant] misterflo13 : ils coute chere les enchent aura de feu et T2 du spawn??*
[10:57:35]  [Amateur] firebow ?.SkyLegend.?  : ouai 0
[10:57:38]  [Novice] iPasteque : ils sont gratuit me
[10:57:41]  [Novice] iPasteque : ils sont gratuit mec *
[10:57:46]  [Dbutant] misterflo13 : on ma dit k'ils etait payent :o
[10:57:57]  [Novice] iPasteque : on t'a mytho alors

忽略我想要删除[& ](需要看起来像[]。[&]之间的时间每秒更新一次。

3 个答案:

答案 0 :(得分:1)

看起来您的日志具有特定格式。你似乎想摆脱时间并保留所有其他信息。好的 - 阅读评论

我没有测试它,但它应该工作

' Read log
Dim logLines() As String = File.ReadAllLines("File_path")
If logLines.Length = 0 Then Return
' prepare array to fill sliced data
Dim lines(logLines.Length - 1) As String

For i As Integer = 0 To logLines.Count - 1
    ' just cut off time part and add empty brackets for each line
    lines(i) = "[]" & logLines(i).Substring(10)
Next

您在上面看到的内容 - 如果您知道您的文件采用某种格式,只需使用字符串中的位置将其剪切掉即可。

  

注意:上面的代码可以使用LINQ

在一行中完成

如果您想要实际获取数据,请使用IndexOf。由于您要查找第一次出现的“[”或“]”,只需使用起始索引“0”

' get position of open bracket in string
Dim openBracketPos As Integer = myString.IndexOf("[", 0, StringComparison.OrdinalIgnoreCase)
' get position of close bracket in string
Dim closeBracketPos As Integer = myString.IndexOf("]", 0, StringComparison.OrdinalIgnoreCase)

' get string between open and close bracket
Dim data As String = myString.Substring(openBracketPos + 1, closeBracketPos - 1)

答案 1 :(得分:0)

如果你的问题是删除[]中出现的格式为99:99:99的数字字符串,我会这样做:

//假设您要将[......]数字字符串替换为空[]。如果要完全删除标记,只需使用string.Empty

替换

这是一个演示(在C#中,而不是VB,但你得到了重点(你需要正则表达式,而不是语法)

    List<string> list = new List<string>
    {
        "[13:00:00]",
        "[4:5:0]",
        "[5d2hu2d]",
        "[1:1:1000]",
        "[1:00:00]",
        "[512341]"
    };

    string s = string.Join("\n", list);
    Console.WriteLine("Original input string:");
    Console.WriteLine(s);

    Regex r = new Regex(@"\[\d{1,2}?:\d{1,2}?:\d{1,2}?\]");
    foreach (Match m in r.Matches(s))
    {
        Console.WriteLine("{0} is a match.", m.Value);
    }

    Console.WriteLine();
    Console.WriteLine("String with occurrences replaced with an empty string:");
    Console.WriteLine(r.Replace(s, string.Empty).Trim());

enter image description here

答案 2 :(得分:0)

这是使用Regex的另一种可能性:

Public Function ReplaceTime(ByVal Input As String) As String
    Dim m As Match = Regex.Match(Input, "(\[)(\d{1,2}\:\d{1,2}(\:\d{1,2})?)(\])(.+)")
    Return m.Groups(1).Value & m.Groups(4).Value & m.Groups(5).Value
End Function

它更像是一个可读性噩梦,但效率很高,只需要包含时间值的括号。

我也冒昧地使其匹配,例如13:47以及13:47:12

测试:http://ideone.com/yogWfD

(编辑)多行示例:

您可以将其与File.ReadAllLines()(如果您喜欢的话)和For循环结合使用以完成替换。

Public Function ReplaceTimeMultiline(ByVal TextLines() As String) As String
    For x = 0 To TextLines.Length - 1
        TextLines(x) = ReplaceTime(TextLines(x))
    Next
    Return String.Join(Environment.NewLine, TextLines)
End Function

以上代码用法:

Dim FinalT As String = ReplaceTimeMultiline(File.ReadAllLines(<file path here>))

另一个多行示例:

Public Function ReplaceTimeMultiline(ByVal Input As String) As String
    Dim ReturnString As String = ""
    Dim Parts() As String = Input.Split(Environment.NewLine)
    For x = 0 To Parts.Length - 1
        ReturnString &= ReplaceTime(Parts(x)) & If(x < (Parts.Length - 1), Environment.NewLine, "")
    Next
    Return ReturnString
End Function

多行测试:http://ideone.com/nKZQHm