这是半个问题和半个有趣的测验,因为正则表达式会非常复杂并且很难创建。
如果我自己这样做(因为我实际上需要使用它),我会写一个文件解析器而不是正则表达式,虽然我知道在这种情况下可以使用正则表达式,我想也许有些StackOverflow程序员喜欢挑战。
作为一种“奖励”,我会将问题保持开放7天,此时<150>声誉的赏金将归于具有正确答案的人。我知道回答者可能有> 3K的声誉,但我认为代表仍然是代表。 :)
正则表达式必须转向:
[DllImport(EngineDll)]
public static extern int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth));
分为:
public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth))
{
if (Engine.ThreadSafe)
{
lock (typeof(Dll))
{
return Dll.Graphics(width, height, depth, hertz, flags);
}
}
else
{
return Dll.Graphics(width, height, depth, hertz, flags);
}
}
由于根本不需要多行,如果您发现它更容易解析,则可以将其全部放在一行:
public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)) { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.Graphics(width, height, depth, hertz, flags); } } else { return Dll.Graphics(width, height, depth, hertz, flags); } }
现在,如果不够明显,那么变量是返回类型,方法名称,参数类型,参数名称,参数是否具有默认值,在这种情况下是默认值。该函数可能是void,在这种情况下应该没有return语句。
根据要求:第二个输入输出:
[DllImport(EngineDll)]
public static extern void EndRender();
输出:
public static void EndRender()
{
if (Engine.ThreadSafe)
{
lock (typeof(Dll))
{
Dll.EndRender();
}
}
else
{
Dll.EndRender();
}
}
再次,1-liners接受了。
祝你好运! :)请注意所有可能会说我只是懒惰的人:改变问题。
答案 0 :(得分:1)
您无法使用真正的正则表达式执行此操作,因为您需要能够在默认值中处理平衡括号。也就是说,有正则表达方言带有扩展,允许你处理这类事情,所以让我们开始滚动:
s/[DllImport(EngineDll)]\npublic\ static\ extern\ #boilerplate
(?<method> #capturing group for the method signature
(?<return>\w+)\ #Method return type
(?<name>\w+)\( #Method name
(?<parameter>\w+\ #parameter type
(?<parname>\w+)\ #parameter name
(=\ (?&DEFAULTVALUEREGEX))? #optional default value
(?{$params = $+{parname}}) #Ok, so this isn't even pretending to be a regex
# anymore. If anyone has any better ideas...
)(?:,\ #parameter seperator
\w+\ (?<par>\w+)\ (=\ (?&DEFAULTVALUEREGEX))?
(?{ $params .= ", " . $+{par}}))* # more parameters
\)); # boilerplate
/
public static $+{method} { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.$+{name}($params); } } else { return Dll.$+{name}($params); }}
/x
我没有包含DEFAULTVALUEREGEX的定义,因为这基本上要求你解析任何有效的C#表达式,这个表达式足以掩盖逻辑的其余部分。它也使用(?{code})
构造,使得它甚至可以算作一种正则表达式,这使得它非常可疑。我也没有测试它,因为我很懒,而且它真的很脆弱(它会打破一堆仍然有效的C#)。
如果有人有任何改进,请随时编辑它们 - 这就是为什么它首先是CWiki。
答案 1 :(得分:0)
那么,这有什么问题?
s/.*/public static int Graphics(int width, int height, int depth = default(int), int hertz = 60, int flags = (int)(GraphicsBufferType.Back | GraphicsBufferType.Depth)) { if (Engine.ThreadSafe) { lock (typeof(Dll)) { return Dll.Graphics(width, height, depth, hertz, flags); } } else { return Dll.Graphics(width, height, depth, hertz, flags); } }/;
既然它(可能)不是你想到的那样,那么同样的正则表达式也必须进行另一种转换 - 否则我提供的就足够了。