Найдите строку и замените ее более эффективно - PullRequest
0 голосов
/ 03 июля 2010

Ситуация: у меня есть HTML-файл, и мне нужно удалить определенные разделы.

Например: файл содержит html: <div style="padding:10px;">First Name:</div><div style="padding:10px; background-color: gray">random information here</div><div style="padding:10px;">First Name:</div><div style="padding:10px; background-color: gray">random information here</div>

Мне нужно удалить весь текст, который начинается с "<div style="padding:10px; background-color: gray">" и заканчивается на "</div>", чтобы результатбыть:

<div style="padding:10px;">First Name:</div><div style="padding:10px;">First Name:</div>

Я создал 2 функции, которые делают это, но я не делаю это эффективным.У меня есть файл 40 МБ, и программа занимает около 2 часов.Есть ли более эффективный способ сделать это?Есть ли способ использовать регулярные выражения?

См. Мой код ниже:

Public Shared Function String_RemoveText(ByVal startAt As String, ByVal endAt As String, ByVal SourceString As String) As String
    Dim TotalCount As Integer = String_CountCharacters(SourceString, startAt)
    Dim CurrentCount As Integer = 0

RemoveNextString:

    Dim LeftRemoved As String = Mid(SourceString, InStr(SourceString, startAt) + 1, Len(SourceString) - Len(endAt))
    Dim RemoveCore As String = Left(LeftRemoved, InStr(LeftRemoved, endAt) - 1)
    Dim RemoveString As String = startAt & RemoveCore & endAt


    Do
        '    Application.DoEvents()
        SourceString = Replace(SourceString, RemoveString, "")
        If InStr(SourceString, startAt) < 1 Then Exit Do
        GoTo RemoveNextString
    Loop

    Return Replace(SourceString, RemoveString, "")

End Function

Public Shared Sub Files_ReplaceText(ByVal DirectoryPath As String, ByVal SourceFile As String, ByVal DestinationFile As String, ByVal sFind As String, ByVal sReplace As String, ByVal TrimContents As Boolean, ByVal RemoveCharacters As Boolean, ByVal rStart As String, ByVal rEnd As String)

    'CREATE NEW FILENAME
    Dim DateFileName As String = Date.Now.ToString.Replace(":", "_")
    DateFileName = DateFileName.Replace(" ", "_")
    DateFileName = DateFileName.Replace("/", "_")
    Dim FileExtension As String = ".txt"
    Dim NewFileName As String = DirectoryPath & DateFileName & FileExtension
    'CHECK IF FILENAME ALREADY EXISTS
    Dim counter As Integer = 0
    If IO.File.Exists(NewFileName) = True Then
        'CREATE NEW FILE NAME
        Do
            'Application.DoEvents()
            counter = counter + 1
            If IO.File.Exists(DirectoryPath & DateFileName & "_" & counter & FileExtension) = False Then
                NewFileName = DirectoryPath & DateFileName & "_" & counter & FileExtension
                Exit Do
            End If
        Loop
    End If
    'END NEW FILENAME

    'READ SOURCE FILE
    Dim sr As New StreamReader(DirectoryPath & SourceFile)
    Dim content As String = sr.ReadToEnd()
    sr.Close()

    'WRITE NEW FILE
    Dim sw As New StreamWriter(NewFileName)

    'REPLACE VALUES
    content = content.Replace(sFind, sReplace)

    'REMOVE STRINGS
    If RemoveCharacters = True Then content = String_RemoveText(rStart, rEnd, content)


    'TRIM
    If TrimContents = True Then content = Regex.Replace(content, "[\t]", "")

    'WRITE FILE
    sw.Write(content)

    'CLOSE FILE
    sw.Close()
End Sub

Пример для выполнения кода (также удаляет Chr (13) & Chr (10): Files_ReplaceText(tPath.Text, tSource.Text, "", Chr(13) & Chr(10), "", True, True, tStart.Text, tEnd.Text)

1 Ответ

2 голосов
/ 03 июля 2010

Не используйте RegEx для разбора HTML - это не обычный язык. Смотрите здесь для некоторых убедительных демонстраций.

Используйте HTML Agility Pack для анализа HTML и замены данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...