1

単語を見つけて、正規表現を使用してそれらを置き換えようとしています。スタックオーバーフローの例外が発生し続けます。再帰ループが原因であると考えています。そこで、コードの最初のブロックからforループを削除しようとしましたが、コードの2番目のブロックを思い付きましたが、それでも同じ問題が発生しました。

大文字と小文字を区別せずに特定の文字列を見つけて、同じ文字列の正しい大文字と小文字に自動的に置き換えようとしています。したがって、例として、誰かが「vB」と入力すると、自動的に「vb」に置き換えられます。私の問題はtextchangedイベントに参加していることに起因していることを知っているので、誰かが私を正しい方向に導くことができれば、私は非常に感謝します。

Private Sub tb_textchanged(ByVal sender As System.Object, ByVal e As    TextChangedEventArgs)

    Dim pattern As String = "\<vb\>"
    Dim input As String = txt.Text
    For Each m As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
        Dim caretpos As FastColoredTextBoxNS.Place = New Place(txt.Selection.Start.iChar, txt.Selection.Start.iLine)
        Dim replacement As String = "<vb>"
        Dim rgx As New Regex(pattern)
        Dim result As String = rgx.Replace(input, replacement, RegexOptions.IgnoreCase)
        txt.Text = result
        txt.Selection.Start = New Place(caretpos.iChar, caretpos.iLine)
    Next

End Sub

Forループを置き換えた後。

Private Sub tb_textchanged(ByVal sender As System.Object, ByVal e As TextChangedEventArgs)

    Dim pattern As String = "\<vb\>"
    Dim input As String = txt.Text
    Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
    If matches.Count > 0 Then
        Dim caretpos As FastColoredTextBoxNS.Place = New Place(txt.Selection.Start.iChar, txt.Selection.Start.iLine)
        Dim replacement As String = "<vb>"
        Dim rgx As New Regex(pattern)
        Dim result As String = rgx.Replace(input, replacement, RegexOptions.IgnoreCase)
        txt.Text = result
        txt.Selection.Start = New Place(caretpos.iChar, caretpos.iLine)
    End If

End Sub
4

2 に答える 2

2

あなたの問題は、誰かがテキストを変更すると、それが置き換えを行うことです。置換するとテキストが変更されます。その後、イベントハンドラーが再度呼び出されます。など。スタックスペースが不足するまで無限再帰が発生し、スタックオーバーフローが発生します。

これを解決するには、メソッド呼び出しの間にブール値を保持します。trueの場合は、イベントハンドラーを早期に終了します。それ以外の場合はtrueに設定し、イベントハンドラーを終了するときはfalseに設定します。

于 2012-12-29T03:44:46.410 に答える
0
Private isRecursive As Boolean
Private Sub tb_textchanged(ByVal sender As System.Object, ByVal e As TextChangedEventArgs)

    If (isRecursive) Then
        Return
    End If
    isRecursive = True

    Dim pattern As String = "\<vb\>"
    Dim input As String = txt.Text
    Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
    If matches.Count > 0 Then
        Dim caretpos As FastColoredTextBoxNS.Place = New Place(txt.Selection.Start.iChar, txt.Selection.Start.iLine)
        Dim replacement As String = "<vb>"
        Dim rgx As New Regex(pattern)
        Dim result As String = rgx.Replace(input, replacement, RegexOptions.IgnoreCase)
        txt.Text = result
        txt.Selection.Start = New Place(caretpos.iChar, caretpos.iLine)
    End If

    isRecursive = False
End Sub
于 2012-12-29T03:55:56.213 に答える