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 は、指定された位置 (列 + 行) から行内の検索を開始します。このようにして、次の行で「終了」を見つけることができます。


その場で下書き:

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 に答える