2016-08-02 4 views
1

나는 패턴 문자열이 "{국가}에 오신 것을 환영합니다 안녕하세요 {이름},"
및 전체 값 문자열 : "안녕하세요 스콧, 베트남에 오신 것을 환영합니다"
어떻게
이름 = 스콧, 나라 = 베트남
나는이 문제를 해결하기 위해 몇 가지 정규 표현식을 볼 수 있지만 내가 여기에 퍼지 매칭을 적용 할 수 있습니다 : 나는 {이름}의 값과 {나라}을 추출?
예 : 역행 문자열 "베트남에 오신 것을 환영합니다. Hello Scott", 정규 표현식도 변경해야합니까?가져 오기 문자열 값

+0

문제를 재현 할 수있는 최소한의 코드가 없기 때문에이 질문을 주제와 관련이없는 것으로 보겠습니다. –

+0

정규 표현식을 사용해 보았지만 실제 질문은 표현식을 변경하지 않고 일반적인 방식으로 값을 추출하는 방법입니다. – phuongnd

+0

@phuongnd 업데이트 된 답변은 두 가지 방식으로 모두 작동합니다. –

답변

1

: 방법은 패턴에서 토큰 이름을 추출

public Dictionary<string, string> GetMatches(string pattern, string source) 
{ 
    var tokens = new List<string>(); 
    var matches = new Dictionary<string, string>(); 

    pattern = Regex.Escape(pattern); 

    pattern = Regex.Replace(pattern, @"\\{.*?}", (match) => 
     { 
      var name = match.Value.Substring(2, match.Value.Length - 3); 

      tokens.add(name); 

      return $"(?<{name}>.*)"; 
     }); 

    var sourceMatches = Regex.Matches(source, pattern); 

    foreach (var name in tokens) 
    { 
     matches[name] = sourceMatches[0].Groups[name].Value; 
    } 

    return matches; 
} 

후 대체 capture group이라는 정규식과 동일한 구문을 갖는 토큰. 그런 다음 수정 된 패턴을 정규 표현식으로 사용하여 소스 문자열에서 값을 추출합니다. 마지막으로 캡처 된 토큰 이름과 명명 된 캡처 그룹을 사용하여 반환 할 사전을 작성합니다.

+0

최고의 솔루션을 만나보십시오! – phuongnd

3

당신은 정규식을 사용할 수 있습니다

var Matches = Regex.Matches(input, @"hello\s+?([^\s]*)\s*|welcome\s+?to\s+?([^\s]*)", RegexOptions.IgnoreCase); 

string Name = Matches.Groups[1].Value; 
string Country = Matches.Groups[2].Value; 

업데이트 : 변경된 코드는 하나의 방식으로 작동 할 수 있습니다. Demo. 다음과 같이 할 수

+1

정규식을 사용하여 템플릿에서 토큰을 추출하고 원래 토큰을 명명 된 캡처 그룹으로 바꾸고 나머지 문자열을 이스케이프 처리하는 새 정규식을 작성하십시오. – seairth

0

그냥 신속하고 더러운 ... 더 일반적인 솔루션으로

string pattern = "Hello Scott, welcome to VietNam"; 

var splitsArray = pattern.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 
var Name = splitsArray[1].Replace(",", string.Empty); 
var country = splitsArray[4]; 
관련 문제