gpt4 book ai didi

正则表达式模式重复和捕获

转载 作者:行者123 更新时间:2023-12-01 11:07:38 26 4
gpt4 key购买 nike

我最近不得不在 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}"));

我使用 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*)+

但无法让它与群组一起工作。有人可以告诉我使用正则表达式执行此操作的“标准”方法吗?

最佳答案

不幸的是,当您使用量词执行匹配时,该组将匹配整个文本,因此更“优雅”的解决方案是使用相当于 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 程序员,因此如果此代码中有任何重大错误,请随时更正它们

关于正则表达式模式重复和捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17962535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com