2013-07-31 2 views
3

최근 C#에서 propkeys.h (C [++]?)를 번역해야했습니다.정규식 반복 및 캡쳐

DEFINE_PROPERTYKEY(PKEY_Audio_ChannelCount, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 7); 

에 :

내 목표에서 온 것이었다

public static PropertyKey Audio_ChannelCount = new PropertyKey(new Guid("{64440490-4C8B-11D1-8B70-080036B11A03}")); 

내가 정규식에 대한 ++ 메모장을 사용했다,하지만 난 나오지도 다른 스크립트 솔루션 (펄, 개방적이야. ..). 컴파일 된 언어를 사용하지 마십시오 (C#, Java ...).

나는이 (작업)으로 돌아가 셨습니다 :

// TURNS GUID into String 
// Find what (Line breaks inserted for convenience): 
0x([[:xdigit:]]{8}),\s*0x([[:xdigit:]]{4}),\s*0x([[:xdigit:]] 
{4}),\s*0x([[:xdigit:]]{2}),\s*0x([[:xdigit:]]{2}),\s*0x([[:xdigit:]] 
{2}),\s*0x([[:xdigit:]]{2}),\s*0x([[:xdigit:]]{2}),\s*0x([[:xdigit:]] 
{2}),\s*0x([[:xdigit:]]{2}),\s*0x([[:xdigit:]]{2}) 

// Replace with: 
new Guid\("{$1-$2-$3-$4$5-$6$7$8$9$10$11}"\) 

// Final pass 
// Find what: 
^DEFINE_PROPERTYKEY\(PKEY_(\w+),\s*(new Guid\("\{[[:xdigit:]|\-]+"\)),\s*\d+\);$ 
// Replace with: 
public static PropertyKey $1 = new PropertyKey\($2\); 

이 작동하는 동안, 나는 이상한 첫 번째 패스 뭔가를 생각합니다. {2}의 톤을 단지 반복적 인 것으로 바 꾸었습니다. 같은 뭔가 :

(0x([[:xdigit:]]){2},\s*)+ 

그러나이 그룹에서 작동하지 않습니다. 누군가가 regexes 함께이 일을 "표준"방법을 말해 줄래?

답변

0

불행히도 수량 한정자를 사용하여 일치를 수행하면 그룹이 전체 텍스트와 일치하므로보다 고급스러운 해결책은 perl의 \ G 메타 문자에 해당하는 것을 사용하는 것입니다.이 메타 문자는 이전 시합. 당신이 $ 입술에 결과 문자열을 가져야한다

my $text = "DEFINE_PROPERTYKEY(PKEY_Audio_ChannelCount, 0x64440490, 0x4C8B, 0x11D1, 0x8B, 0x70, 0x08, 0x00, 0x36, 0xB1, 0x1A, 0x03, 7);"; 
my $res = "public static PropertyKey Audio_ChannelCount = new PropertyKey(new Guid(\"{"; 

if($text =~ m/0x((?:\d|[A-F]){8}),\s*0x((?:\d|[A-F]){4}),\s*0x((?:\d|[A-F]){4})/gc) 
{ 
    $res .= $1 . "-" . $2 . "-" . $3 . "-"; 
} 

if($text =~ m/\G,\s*0x((?:\d|[A-F]){2}),\s*0x((?:\d|[A-F]){2})/gc)# 
{ 
    $res .= $1 . $2 . "-"; 
} 

while($text =~ m/\G,\s*0x((?:\d|[A-F]){2})/gc) 
{ 
    $res .= $1; 
} 

$res .= "}\"))"; 

print $res . "\n"; 

그 후 :이 (펄) 같은 것을 사용할 수 있습니다. 이 스크립트를 실행 내 출력했다 :

public static PropertyKey Audio_ChannelCount = new PropertyKey(new Guid("{64440490-4C8B-11D1-8B70-080036B11A03}"))

면책 조항 :이 코드에 실질적인 오류가 있는지, 그들에게

를 해결 주시기 바랍니다 그래서, 펄 프로그래머가 아니에요