2016-07-02 1 views
0

찾기 및 바꾸기 대화 상자를 정규식 옵션으로 만들었습니다. 정규식을 테스트하고 모든 일치 항목을 강조 표시하는 버튼과 개별적인 일치 항목을 찾기위한 버튼이 있습니다. 정규식을 사용하면 두 메소드가 모두 동일한 일치를 만듭니다. 다른 정규식은 Regex.Match과 일치하지 않지만 Regex.Matches의 모음으로 예상대로 작동합니다. Regex를 지정할 때 다른 RegexOptions을 시도했지만 원하는대로 작동하지 않는 옵션을 찾지 못했습니다.Regex.Match가 Regex.Matches와 동일한 문자열과 일치하지 않는 이유는 무엇입니까?

여기서 목표는 ButtonTestRegex으로 정규식을 테스트 한 다음 찾기 또는 바꾸기 버튼을 사용하여 각 일치 항목을 선택할 수 있도록하는 것입니다.

1 : 나머지

중복 1 : 나머지 1의 중복의

중복 : 나머지

에서 다음을 함유하여 RichTextBox 함께

Public rtb as RichTextBox 

Private Sub ButtonTestRegex_Click(sender As Object, e As EventArgs) 
    rtb.Select(0, rtb.TextLength) 
    rtb.SelectionColor = Color.Black 

    Dim rgx As New Regex("(duplicate of)*([0-9]:+)*") 

    Dim matches As MatchCollection = rgx.Matches(rtb.Text) 
    For Each match In matches 
     rtb.Select(match.index, match.length) 
     rtb.SelectionColor = Color.Red 
    Next 
End Sub 

Private Sub ButtonFind_Click(ByVal sender As Object, ByVal e As EventArgs) 
    rtb.Focus() 
    rtb.selectionstart = 0 
    rtb.selectionlength = 0 
    Dim rgx = New Regex("(duplicate of)*([0-9]:+)*") 
    Dim match As Match = rgx.Match(rtb.Text) 
    If match.Value <> "" Then 
     rtb.SelectionStart = match.Index 
     rtb.SelectionLength = match.Length 
    End If 
End Sub 

위의 코드는 "나머지"를 제외한 모든 텍스트와 일치합니다. ButtonTestRegex_Click() (예상대로). ButtonFind_Click()과 일치하는 것은 없습니다. 코드가 실행되고 있으며 일부 정규식과 함께 작동합니다. [0-9].

이 코드 샘플은 간략하게 표시하기 위해 생략되었습니다. 제 질문은, Regex.Match은이 경우에 아무것도 일치하지 않지만, 왜 Regex.Matches은 무엇입니까?

+2

대답은 아마도 * ([0-9] : +) *'(중복) *는 빈 문자열과 일치 할 수 있습니다. 정규식. 매치를 사용하면이 방법은 모든 위치를 스캔하므로 아무런 문제가 없습니다. 문자열과 Regex.Match는 시작 부분에 선택적 패턴과 일치하는 텍스트가 없거나 문자열의 시작 부분에있는 텍스트가 선택적 패턴과 일치하는 경우 일치를 반환해야하는 경우 문자열 시작 부분과 일치합니다. 해결 방법은 비어 있지 않은 문자열과 일치하도록 패턴을 수정하는 것입니다. –

답변

1

RichTextBox에 의해 선택된 텍스트의 시작 부분에 공백이 있는지 의심 스럽습니다. 그 시점에서, 그것은 완전히 이해가됩니다. 정규식을 확인하십시오.

(duplicate of)*([0-9]:+)* 

빈 문자열과 일치합니다. 예를 들어, "x"에 대한 모든 일치 항목을 발견하면 x 앞에 하나의 일치 항목이 표시되고 x 다음에 일치 항목이 하나 있습니다.

Match을 호출하면 이 처음으로과 일치합니다 (성공적으로 처리되었지만 빈 문자열과 일치 함). Matches에 전화하면 모두 일치 항목이 검색되며 그 중 많은 수가 있습니다. 여기에 그들 모두를 보여줄 수있는 작은 C의 # 콘솔 응용 프로그램은 텍스트의 시작 부분에 공간을 가정의는 :

0 
2 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
15 
0 

을 ...하지만 있다 :

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var regex = new Regex("(duplicate of)*([0-9]:+)*"); 
     var input = @" 1:remainder 
duplicate of 1:remainder 
duplicate of duplicate of 1:remainder"; 
     foreach (Match match in regex.Matches(input)) 
     { 
      Console.WriteLine(match.Length); 
     } 
    } 
} 

그의 출력은 다음과 같이 시작 출력의 많은.

일치하는 항목이 무엇인지 완전히 명확하지 않지만 빈 문자열 과 일치하지 않는지 확인하고 싶을 수 있습니다.

+0

그래서 경기를 만들고있었습니다. 나는 그것을보기에 충분할 정도로 찾기 버튼을 클릭하지 않았다. 나를위한 보너스 레슨은 RichTextBox의 시각적 변화에 의존하는 대신 실제 일치하는 것을보기 위해 콘솔을 사용하는 것입니다. 고맙습니다. – codingcoding

+0

@codingcoding : 대부분의 경우, 빠른 콘솔 앱은 디버깅의 효율적인 방법입니다. 방해 할 UI가 없으며 필요한 코드 만 있습니다. :) –

관련 문제