2012-12-29 2 views
1

나는 단어를 찾고 정규식을 사용하여 바꾸려고합니다. 스택 오버 플로우 예외가 계속 발생하고, 재귀 루프로 인해 geussing이 발생했습니다. 그래서 첫 번째 코드 블록에서 for 루프를 제거하고 두 번째 코드 블록을 작성했지만 여전히 동일한 문제가 발생했습니다.누구나이 스택 오버플로의 원인을 알려 줄 수 있습니까?

대소 문자를 무시하면서 특정 문자열을 찾아서 동일한 문자열의 대소 문자로 자동 바꾸려고합니다. 예를 들어 누군가가 "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 

답변

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 
+1

안녕하세요, Jeremy, 저에게 감사드립니다. if 문을 변경하고 return에서 줄 바꿈을 제거하고이를 반영하도록 게시물을 편집해야했습니다. 나는 당신이 C# 프로그래머입니다 geussing 오전. 어쨌든 덕분에, 그것은 잘 작동합니다. :) – user1632018

2

누군가가 텍스트를 변경하면 대체가됩니다. 대체 텍스트가 텍스트를 변경합니다. 그런 다음 이벤트 핸들러가 다시 호출됩니다. Etc 등. 스택 공간이 부족해질 때까지 무한 재귀가 발생하여 스택 오버플로가 발생합니다.

이 문제를 해결하려면 메서드 호출간에 어딘가에 부울을 유지합니다. 사실이라면 이벤트 핸들러를 빠져 나가십시오. 그렇지 않으면 true로 설정하고 이벤트 핸들러를 나가면 false로 설정하십시오.

관련 문제