2015-02-03 5 views
0
 string input = "They ate a donut", output = "a donut was eaten by ${someone}."; 
     Regex r = new Regex("(?<someone>) ate a donut"); 
     if (r.IsMatch(input)) 
     { 
      foreach (string s in r.GetGroupNames()) 
      { 
        Debug.WriteLine(r.Replace(input, output)); 
      } 
     } 

컨텍스트는 "도넛이 먹었습니다"라고 표시하지만 대신 "도넛 도넛을 먹었습니다."라고 표시됩니다.이 Regex 연산이 작동하지 않는 이유는 무엇입니까?

대체 이유가 무엇인지를 계속 찾고 있기 때문에 그 이유가 확실하지 않습니다.

마지막으로 Regex r에는 하나의 명명 된 그룹 만 있으므로 루프의 반복이 하나만 있으면 안됩니다. 앞에서 언급 한 출력의 두 줄을 얻습니다.

답변

1

기본 문제는 (?<someone>) 아무것도 포착하지 않습니다. 이름이 지정된 그룹이지만 그룹에 일치시킬 내용이 있거나 비어있는 문자열과 일치해야합니다. 따라서 " ate a donut""a donut was eaten by "으로 바꾸고 접두어 "They"을 남겨 둡니다.

(?<someone>)을 예 : (?<someone>\w+) 그리고 단어 (A-Z, a-z, 0-9 또는 밑줄 중 하나 이상)를 캡처해야합니다. C# 문자열 리터럴에 \을 작성하려면 \\을 작성해야하며 " 대신 @"으로 문자열을 시작해야합니다.

또한 전체 일치 항목이 그룹 0으로 계산되므로 루프가 두 번 반복됩니다. 따라서 그룹이 "0"이고 그룹이 "누군가"가됩니다.

+1

그 덕분에, 고마워! 나는 거기에있는 캡처 그룹이 나머지 캐릭터를 포착 할 것이라고 생각했습니다. 이제 다소 어리석은 느낌이 들었습니다. – user3624514

0
^(?<someone>\S+).*$ 

시도해보십시오. a donut was eaten by ${someone}.으로 바꾸십시오. 데모를 참조하십시오.

https://regex101.com/r/vD5iH9/62

+0

'? P'는 .NET 정규식에서 유효하지 않습니다. 또한 앵커를 추가하고 의미있는 텍스트를 이유없이 '. *'로 대체했습니다. – Rawling