2011-01-02 6 views
0

C 번호 : 정규 표현식

List<string> KeyList = new List<string>(); 
List<string> ValueList = new List<string>(); 

같은 즉 "키리스트"와 "ValueList를"

List<String> l_lstRowData = new List<string> { "Data 1 32:01805043*0FFFFFFF", 
               "Data 3, 20.0e-3", 
               "Data 2, 1.0e-3 172:?:CRC" , 
               "Data 6" 
               }; 

두 개의 목록을 다음과 같이 내가 행 데이터의 집합을 데

나는 두 가지를 작성해야 여기 Pattern Matching

그리고를 사용 l_lstRowData의 데이터에서 List<String>

,536 내 Pattern입니다

Group "정수 값 다음에 data 일치해야 패턴에 KEY하고, 존재하는 경우 :

String l_strPattern = @"(?<KEY>(Data|data|DATA)\s[0-9]*[,]?[ ]?[0-9e.-]*)[ \t\r\n]*(?<Value>[0-9A-Za-z:?*!. \t\r\n\-]*)"; 
Regex CompiledPattern=new Regex(l_strPattern,RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

그래서 결국 두 List

KeyList 

      { "Data 1" } 
      { "Data 3, 20.0e-3" } 
      { "Data 2, 1.0e-3" } 
      { "Data 6" } 



ValueList 

      { "32:01805043*0FFFFFFF" } 
      { "" } 
      { "172:?:CRC" } 
      { "" } 

시나리오에는 포함됩니다 쉼표 (,) 다음 문자열, 즉 double

Group패턴의은 whitespace 다음의 문자열과 일치해야합니다. 첫 번째 문자열에서 32:01805043*0FFFFFFF과 일치해야하지만 세 번째 172:?:CRC과 일치해야합니다.

여기 내 예제 코드

for (int i = 0; i < l_lstRowData.Count; i++) 
     { 
      MatchCollection M = CompiledPattern.Matches(l_lstRowData[i], 0); 
      KeyList.Add(M[0].Groups["KEY"].Value); 
      ValueList.Add(M[0].Groups["Value"].Value); 

     } 

입니다하지만 내 Pattern이 상황에서 작동하지 않습니다.

편집

KeyList 

      { "Data 1 32" } // 32 should be in the next list 
      { "Data 3, 20.0e-3" } 
      { "Data 2, 1.0e-3" } 
      { "Data 6" } 



ValueList 

      { ":01805043*0FFFFFFF" } 
      { "" } 
      { "172:?:CRC" } 
      { "" } 

가 내 패턴을 재 작성 도와주세요처럼 내 코드 결과.

+0

나는 실패한 경우에 대해 경기를 치고 부분적으로 분해 할 것이다. 예 : "작동하지 않는 것"이 ​​무엇인지 판단하십시오. –

답변

2

나는 간단한 생각 해결할 수 정규식은 작동합니다 : 플래그를 사용하면 (?<key>data \d(?:, [\d.e-]+)?)(?<value>.*)이 키와 값을 일치시킵니다.

이 결과는 Rubular example link에서 볼 수 있습니다.

3

코드가 작동하기 때문에 작동하지 않는 코드를 정의하십시오. 또한

: 당신이 알고 있기 때문에

    은 ^로 정규 표현식을 시작하고 대신 일치의 $
  • 사용 regex.Match()()로 종료
  • 내가 돈 번 돌려드립니다 '이 t은 [,], 대신 \ []
  • 사용의 간단한 공간 대신에 [\ t \ 연구 \ n]은
  • 경우의이야 당신이 IgnorePatternWhitespace는
  • 대신 간단한 쉼표를 사용하는 사용하는 이유 참조 당신이 IgnoreCase를, 데이터에 대한 다음 필요가 없습니다를 지정 | 데이터 | DATA 또는 [A-Za-z]와

그리고 당신이 이것을 정리하면, 어쩌면 당신이 :) 혼자

+0

"문제"를 찾기 위해 조금 시간이 걸렸습니다. 결과에서 ': 01805043 * 0FFFFFFF'은 (예 :) '32 : 01805043 * 0FFFFFFF'로 시작해야합니다. –

+0

위 게시물의 모든 내용에 동의하십시오. 또한 테스트를 단순화하기 위해 Rad 정규 표현식 디자이너 같은 도구를 사용하는 것이 현명해야합니다. – AFract