正确的正则表达式对于这个替换是什么?

时间:2011-01-20 03:14:52

标签: regex

这是半个问题和半个有趣的测验,因为正则表达式会非常复杂并且很难创建。

如果我自己这样做(因为我实际上需要使用它),我会写一个文件解析器而不是正则表达式,虽然我知道在这种情况下可以使用正则表达式,我想也许有些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接受了。

祝你好运! :)

请注意所有可能会说我只是懒惰的人:改变问题。

2 个答案:

答案 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); } }/;

既然它(可能)不是你想到的那样,那么同样的正则表达式也必须进行另一种转换 - 否则我提供的就足够了。