2012-04-08 3 views
0

그래, 내가 정규식을 가지고 있고 그것을 여러 줄 문자열에서 일치하는 것을 찾아야한다.첫 줄 일치 후 정규식 중지

Device Identifier:  disk0 
Device Node:    /dev/disk0 
Part of Whole:   disk0 
Device/Media Name:  OCZ-VERTEX2 Media 

Volume Name:    Not applicable (no file system) 

Mounted:     Not applicable (no file system) 

File System:    None 

Content (IOContent):  GUID_partition_scheme 
OS Can Be Installed:  No 
Media Type:    Generic 
Protocol:     SATA 
SMART Status:    Verified 

Total Size:    240.1 GB (240057409536 Bytes) (exactly 468862128 512-Byte-Blocks) 
Volume Free Space:  Not applicable (no file system) 
Device Block Size:  512 Bytes 

Read-Only Media:   No 
Read-Only Volume:   Not applicable (no file system) 
Ejectable:    No 

Whole:     Yes 
Internal:     Yes 
Solid State:    Yes 
OS 9 Drivers:    No 
Low Level Format:   Not supported 

는 기본적으로 나는 구분자로 콜론과 두 그룹으로 각 라인을 분리해야합니다 이것은 내가 사용하고있는 문자열입니다. 내가 사용하고있는 정규식은 다음과 같습니다

@"([A-Za-z0-9\(\) \-\/]+):([A-Za-z0-9\(\) \-\/]+).*" 

그것은 작업을 수행하지만 첫 번째 줄을 수정 해 내가 원하는처럼 두 그룹으로 분리하지만 그 시점에서 멈 춥니 다. 여러 줄 옵션을 시도했지만 아무런 차이가 없습니다.

나는 정규식 세계에 처음 온 것을 인정해야한다.

도움을 주시면 감사하겠습니다.

+3

사용중인 C# 코드를 포함 할 수 있습니까? –

+0

나는 내 컴퓨터를 돌아 다닌다. –

답변

2

다음 예제는 작동하는 것 같다, 또한 정규 표현식의 이해가 조금 더 쉽게라는 이름의 그룹을 사용합니다.

var dictionary = rgx.Matches(str).Cast<Match>().ToDictionary(match => match.Groups["Key"].Value, match => match.Groups["Value"].Value); 
+0

정확히 내가 필요한 것. 추가 된 사전 코드는 내가 간결하고 우아한 방식으로 원했던 것과 정확히 일치합니다. 감사! –

0

정규식의 문제점은 마지막입니다. *. \ r \ n과 일치하므로 전체 나머지 문자열이 일치합니다.

0

대신 String.Split을 사용하는 것이 좋습니다. 가정의 모든 키는 고유 :

string[] lines = str.Split(new char[] { '\r', '\n'} , 
    StringSplitOptions.RemoveEmptyEntries); 

Dictionary<string, string> dict = lines.ToDictionary(
    line => line.Split(':').First(), 
    line => line.Split(new char[] { ':' }, 2).Last().Trim()); 
0

당신은 정규식 옵션 만일 Singleline을 사용하는 경우는 다음 .* 동안 전체 나머지 문자열과 일치 그래서이 : 재미에 대한

var rgx = new System.Text.RegularExpressions.Regex(@"(?<Key>[^:\r\n]+):([\s]*)(?<Value>[^\r\n]*)"); 
    foreach (var match in rgx.Matches(str).Cast<Match>()) 
    { 
     Console.WriteLine("{0}: {1}", match.Groups["Key"].Value, match.Groups["Value"].Value); 
    } 

,이 사전을 사용하기 쉬운에 전체를 변환 하나만 일치합니다.

만일 Singleline는 .

된 경기를 할 때 (즉, \n가) 당신도 필요하십니까 피드 추가로 라인을 수용 할 수있는 정규식 파서를 알려줍니다. * 모든? 당신이^$ 경기 시작과 라인이 아니라 문자열의 끝을 확인하기 위해 정규식 옵션 여러 줄 함께 사용으로

대체 당신은

^([A-Za-z0-9\(\) \-\/]+):([A-Za-z0-9\(\) \-\/]+)$ 

Aslong를 사용할 수 있습니다.