2011-01-12 3 views
0

私はこの正規表現を使って、OS名を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 Windowsのマッチングで何かをすることによって開始することができ、その後、残りのよう:

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

あなたは効率だけでなく、明確性の理由から、まったくの正規表現を望んでいない可能性があります。 1つのオプションは、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

関連する問題