在解析器中也匹配新行

时间:2013-10-20 05:41:59

标签: .net vb.net

如何匹配具有此类新行的内容

"start does not work
end"

这个很好用

  

“开始这个工作结束”

这就是我调用代码的方式

Debug.Print(ParseData(RichTextBox1.Text, "start", "end"))

这是我正在使用的功能

我称之为20MB到100MB的html文件,文本文件等。所以.Replace(Enviroment.Newline,“”) 将无法正常工作

Function ParseData(strData As String, sStart As String, sStop As String)
    Dim data As String
    Dim i, j, iCount As Integer
    Dim lines As New List(Of String)
    lines.AddRange(strData.Split(Environment.NewLine.ToCharArray, StringSplitOptions.RemoveEmptyEntries))
    For iCount = 0 To lines.Count - 1
        i = lines(iCount).IndexOf(sStart)
        While i <> -1
            j = lines(iCount).IndexOf(sStop, i + sStart.Length)
            If j <> -1 Then
                If j > i + sStart.Length Then
                    data = lines(iCount).Substring(i + sStart.Length, j - (i + sStart.Length)).Trim
                    Debug.Print(data)
                    i = lines(iCount).IndexOf(sStart, j + sStop.Length)
                Else
                    i = -1 'data not long enough
                End If
            Else
                i = -1 'no "stop"
            End If
        End While
    Next
    Return iCount
End Function

1 个答案:

答案 0 :(得分:1)

您不能在解析器中匹配文本,但在扫描程序中。

你可以通过多种方式解决这个问题,但我不确定你真正想要做什么(我的意思是 - 是否还有这个例子)。

  • 你首先拆分文字,所以也许不要将它拆分,并且由于它匹配任何东西都会更容易

  • 编写更多通用函数 - IndexOf,它从给定位置(列+行)开始在线搜索,这样你就可以找到&#34; end&#34;在下一行


即时起草:

public static Tuple<int,int> IndexOf(
  this IEnumerable<string> lines,
  string needle)
{
  foreach (Tuple<string,int> line in lines.ZipWithIndex())
  {
    int idx = line.Item1.IndexOf(needle);
    if (idx!=-1)
      return Tuple.Create(line.Item2,idx);
  }

  return Tuple.Create(-1,-1);
}

假设您从头开始搜索,这是有用的(我猜)。