0

我怎样才能匹配有这样新行的东西

"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
4

1 回答 1

1

您不匹配解析器中的文本,而是匹配扫描仪中的文本。

您可以通过多种方式解决此问题,但我不确定您真正想要做什么(我的意思是 - 是否有比这个示例更多的内容)。

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

  • 编写更通用的函数——IndexOf,从给定位置(列+行)开始在行中搜索,这样你可以在下一行找到“end”


即时草稿:

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);
}

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

于 2013-10-20T06:37:42.787 回答