3

最近、propkeys.h (C[++]?) を 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}"));

正規表現に Notepad++ を使用していましたが、他のスクリプト可能なソリューション (perl、sed...) を使用できます。コンパイル済み言語 (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*)+

しかし、それをグループで動作させることはできません。誰かが正規表現でこれを行う「標準的な」方法を教えてもらえますか?

4

1 に答える 1

0

残念ながら、量指定子を使用して一致を実行すると、グループはテキスト全体に一致するため、より「洗練された」解決策は、前の一致の終了後に一致を開始する perl の \G メタ文字に相当するものを使用することです。次のようなものを使用できます(Perl):

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";

その後、結果の文字列が $res にあるはずです。このスクリプトを実行したときの出力は次のとおりです。

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

免責事項:私は Perl プログラマーではないので、このコードに重大なエラーがある場合は、遠慮なく修正してください。

于 2013-07-31T07:32:39.843 に答える