2011-01-12 5 views
0

OSX 이름을 VMX 파일의 행과 비교하도록 만든이 정규식이 있습니다. 그것은 별도의 elsif 문장으로 시작했지만, 나는 하나의 if 문장으로 끝내었다. 어쨌든, 여기에 코드가 있습니다. 코드를 더 깨끗하게 만들 수있는 방법을 찾고 있지만 각 줄을 별도의 줄에 넣습니다. 더 이상 작동하지 않습니다.REGEX 클리너는 어떻게 만들 수 있습니까?

elsif ($vmx_file =~ m/guestOSAltName\s+=\s"Microsoft\sWindows\sServer\s2003,Web\sEdition"|"Microsoft\sWindows\sSmall\sBusiness\sServer\s2003"|"Microsoft\sWindows\s2000\sAdvanced\sServer"|"Microsoft\sWindows\s2000\sServer"|"Microsoft\sWindows\s2000\sProfessional"|"Microsoft\sWindows\s98"|"Microsoft\sWindows\s95"|"Microsoft\sWindows\sNT\s4"/) { 
      $virtual_machines{$vm}{"Architecture"} = "32-bit"; 
제안에 따라

업데이트 코드,

elsif ($vmx_file =~ m/guestOSAltName\s+=\s"Microsoft\sWindows\sServer\s2003,Web\sEdition|Small\sBusiness\sServer\s2003|"2000\sAdvanced\sServer|2000\sServer|2000\sProfessional|98|95|NT\s4/) { 
      $virtual_machines{$vm}{"Architecture"} = "32-bit"; 

답변

8

당신은, 당신의 정규식 예쁘게 만들기 위해 /x 수정을 사용할 수 있습니다. 이처럼 볼 때

$vmx_file =~ m/guestOSAltName\s+= 
    \s("Microsoft\sWindows\sServer\s2003,Web\sEdition" 
    | "Microsoft\sWindows\sSmall\sBusiness\sServer\s2003" 
    | "Microsoft\sWindows\s2000\sAdvanced\sServer" 
    | "Microsoft\sWindows\s2000\sServer" 
    | "Microsoft\sWindows\s2000\sProfessional" 
    | "Microsoft\sWindows\s98" 
    | "Microsoft\sWindows\s95" 
    | "Microsoft\sWindows\sNT\s4")/x 

는 개선 Robokop와 콘스탄틴 Gredeskoul는 분명하게 제안했다 :

$vmx_file =~ m/guestOSAltName\s+= 
    \s"Microsoft\sWindows\s 
    ( Server\s2003,Web\sEdition 
     | Small\sBusiness\sServer\s2003 
     | 2000\s((Advanced\s)?Server | Professional) 
     | 9[85] 
     | NT\s4 
    ) 
     "/x 
+0

이제 정규 표현식이 TINY입니다. – ianc1215

+0

완벽하게 작동합니다. "답변"을 수여합니다. – ianc1215

4

당신은 마이크로 소프트 윈도우 매칭 뭔가를 수행하여 시작하고 나머지처럼 :

Microsoft\sWindows\s(Server\s2003,Web\sEdition|Small\SBussines...) 
+0

멋진 아이디어! 나는 그것으로 시작할 것이다. – ianc1215

1

당신은 그룹에 괄호를 사용할 수 있습니다 비슷한 항목을 정규식에 넣으면 매번 "Microsoft \ sWindows"를 반복 할 필요가 없습니다. 당신도 사용해야합니까? (\ sWeb \ sEdition)?과 같은 선택 항목 또는 누락 된 항목을 나타 내기 위해?

이 도움이

m/guestOSAltName\s+=\s"Microsoft\sWindows\s?(Server\s2003(\sWeb\sEdition)?| 
Small\sBusiness\sServer\s2003| 
2000\sAdvanced\sServer| 
2000\sServer| 
2000\sProfessional 
98| 
NT\s4)"/ 

희망 (줄 바꿈은 명확성을 위해입니다).

+0

나는 그와 같은 줄 바꿈을 시도했는데 그것 모두에 패턴을 매칭하지 못했습니다. 이유를 모르겠다. – ianc1215

+0

표현의 일부를 둘러싼 "()"이 없어서 작동하지 않았습니다. – ianc1215

+0

나는 Eugene의 답을 좋아한다. 일치하는 이름의 배열을 사용한다. –

2

당신은 더 읽을 수 있도록 패턴에 보간을 사용할 수 있습니다 : 실제로 청소하지 않을 경우

my $names = join '|', @names; 
if ($vmx_file =~ m/guestOSAltName\s+=\s(?:$names)) { 
    $virtual_machines{$vm}{Architecture} = "32-bit"; 
} 
5

당신은 효율성뿐만 아니라 선명도 이유로, 모든 정규식을하지 않을 수 있습니다. 한 옵션은 if 블록 외부의 문자열을 캡처하여 해시 키로 일치시키는 것입니다.

#this could be offloaded to a constants file or some such 
%architecture_by_os = (
    "Microsoft Windows Server 2003,Web Edition" => "32-bit", 
    "Microsoft Windows Small Business Server 2003" => "32-bit", 
    #etc. 
) 

$vmx_file =~ m/guestOSAltName\s+=\s(.*)/; 
$virtual_machine{$vm}{Architecture} = $architecture_by_os{$1}; 
+0

와우는 정말 좋은 생각입니다. 결코 그렇게 생각하지 않았을 것입니다. – ianc1215

관련 문제