2011-11-12 5 views
0

(Name := Sam&&Age=:17&& Score:=C6)과 같은 문자열과 이름, 나이, 점수 등 약 30 개의 속성이있는 Person이라는 클래스가 있습니다. 변수가 있으면 문자열을 파싱하려면 어떻게해야합니까? 특성의 수?정규식을 사용하여 항목 목록을 구문 분석

또한 일부 문자열 바꾸기를 수행하여 문자열을 적절한 JSON으로 변환 한 다음 구문 분석하려고합니다. 생산 코드를위한 좋은 생각 인 것 같습니까?

저는 C# 2010을 사용하고 있습니다.

+1

다음과 같은 오타가 있습니까? –

+1

아니요, 누군가가 불일치 공백 및 같음을 사용하여 DB를 수동으로 편집했습니다. – Lincoln

답변

1

이 정규식은 입력 문자열과 일치해야합니다.

var regex = new Regex(
    @"\(\s*((?<PropertyName>.*?)\s*((:=)|(=:))\s*(?<PropertyValue>.*?)\s*(&&)?\s*)*\)"); 
var match = regex.Match(yourString); 

그런 다음 각 속성/값 쌍을 통해 루프,

설정을이와

\(       Open paren 
\s*       Optional whitespace 
(
    (?<PropertyName>.*?) Property name group 
    \s*      Optional whitespace 
    ((:=)|(=:))    Literal ':=' or '=:' 
    \s*      Optional whitespace 
    (?<PropertyValue>.*?) Property value group 
    \s*      Optional whitespace 
    (&&)?     Optional '&&' (the last one won't have one) 
    \s*      Optional whitespace 
)*       The proceeding can repeat 0-many times 
\)       Close paren 

, 당신은 C#으로 당신의 문자열에 대해 일치를 수행 할 수 있습니다 여기에

\(\s*((?<PropertyName>.*?)\s*((:=)|(=:))\s*(?<PropertyValue>.*?)\s*(&&)?\s*)*\) 

는 의미입니다 개체의 속성 객체 속성을 설정하려면 객체 속성 유형에 따라 약간의 반사와 다른 코드가 필요합니다.

var properyNames = match.Groups["PropertyName"].Captures; 
var properyValues = match.Groups["PropertyValue"].Captures; 
var numPairs = propertyNames.Count; 

var objType = yourObj.GetType(); 
for (var i = 0; i < numPairs; i++) 
{ 
    var propertyName = propertyNames[i].Value; 
    var theValue = propertyValues[i].Value; 

    var property = objType.GetProperty(propertyName); 
    object convertedValue = theValue; 
    if (property.PropertyType == typeof(int)) 
     convertedValue = int.Parse(theValue); 
    if (property.PropertyType == typeof(DateTime)) 
     // .... 
    // etc.... 

    property.SetValue(yourObj, convertedValue, null); 
} 
+0

감사합니다. Jacob, very nice :) 유효한 JSON으로의 변환에 대해 어떻게 생각합니까? 코드가 짧아 보이지만 성능 및 안정성에 대해 확신하지 못하는 것 같습니다. – Lincoln

+0

음,'&&'는 어떨까요? – Lincoln

+0

얼마나 당황 스럽습니까? 감사합니다. 링컨. 결정된. – Jacob

1

JSON 방식을 사용해야합니다. regex에 의존하는 것보다 훨씬 깔끔하고 견고합니다.

이것 좀 봐 : Parse JSON in C#

+1

'JavaScriptSerializer'는 JSON 시리얼 라이저 (serializer)가 내장되어 있습니다. – Jacob

+0

System.Web.Script.Serialization.JavaScriptSerializer와 같이 몇 가지가 있습니다. – Lincoln

+0

내 .NET 지식을 패치하기위한 Thx, 나는 이것들을 정말로 봐야 만한다. 고마워! – CodeZombie

1

당신의 구분 & & 경우, 나는 String.Split("&&", myTextString)을 할 거라고 키/값 쌍을 분리하는 정규식 (\w+)\s*:=\s*(\w+)를 사용하는 경우.

관련 문제