2014-01-28 4 views
0

아래 문자열을 가지고 있는데 FieldNN 인스턴스를 함수의 출력으로 바꾸고 싶습니다.정규식을 함수로 바꾸고 다른 일치 항목을 삭제하십시오.

지금까지 NN 인스턴스를 함수의 출력으로 바꿀 수있었습니다. 하지만 같은 정규 표현식으로 정적 "필드"부분을 어떻게 삭제할 수 있는지 잘 모르겠습니다.

입력 문자열 :

(Field30="2010002257") and Field1="yuan" not Field28="AAA" 

필요한 출력 :

public string translateSearchTerm(string searchTerm) { 
    string result = ""; 

    result = Regex.Replace(searchTerm.ToLower(), @"(?<=field).*?(?=\=)", delegate(Match Match) { 
     string fieldId = Match.ToString(); 
     return String.Format("_{0}", getFieldName(Convert.ToInt64(fieldId))); 
    }); 

    log.Info(String.Format("result={0}", result)); 

    return result; 
} 

주는 :

(field_IncidentId="2010002257") and field_Author="yuan" not field_Recipient="aaa" 
,536

(IncidentId="2010002257") and Author="yuan" not Recipient="AAA" 

이 코드는 내가 지금까지 가지고있다 내가 해결하고 싶은개

이슈는 다음과 같습니다

  1. 출력에서 ​​정적 "필드"접두사를 제거합니다.
  2. "FieldNN"부분에서 대소 문자를 구별하지 말고 인용 된 텍스트 부분은 소문자로 만드십시오.
  3. 정규식을보다 견고하게 만들어 인용 문자열 부분에 큰 따옴표 나 작은 따옴표를 사용하도록합니다. FieldNN = "AAA"를 FieldNN = "AAA"
정말 첫 번째 문제를 해결해야

, 다른 세 보너스가 될 것이지만, 대 : 공백이 무시되도록

  • 은 정규식이 더 강력합니다 공백과 따옴표에 맞는 패턴을 발견하면 문제를 해결할 수있을 것입니다.

    업데이트

    나는 아래의 패턴 대신에 긍정적 인 lookbehind의 첫 번째 문제의 사용 그룹 해결하려면 문제 2.와

    result = Regex.Replace(searchTerm, @"(?<=\b(?i:field)).*?(?=\s*\=)", delegate(Match Match) 
    
  • +0

    두 번째 및 세 번째 문제를 완전히 이해하지 못했습니다. 2) 지금은 정규식에서 대소 문자를 구분하지 않습니다. 3) 값 부분을 변경하지 않고 정규 표현식에 포함해야하는 이유는 무엇입니까? –

    +0

    @ Yevgeniy.Chernobrivets 2) 예. 대소 문자를 구별하지 않지만 인용 된 문자열도 소문자로 처리합니다. 3) 가치 부분을 변경하지 않지만 값부에있는 FieldNN과 일치 할 것이라고 걱정했습니다 (표현이 너무 욕심스러운 경우) – hairyone

    답변

    0

    4.를 해결 생각이에서

    public string translateSearchTerm(string searchTerm) { 
        string result = ""; 
    
        result = Regex.Replace(searchTerm.ToLower(), @"field(.*?)(?=\=)", delegate(Match Match) { 
         string fieldId = Match.Groups[1].Value; 
         return getFieldName(Convert.ToInt64(fieldId)); 
        }); 
    
        log.Info(String.Format("result={0}", result)); 
    
        return result; 
    } 
    

    을 대문자 "field"접두어가 각 일치에 포함되어 대체됩니다.

    +0

    Thanks @ Yevgeniy.Chernobrivets :) – hairyone

    관련 문제