0

I want to write a perl regex to match a C/C++ multiline preprocessor macro. I came up with

\#([\W\w\s\d])*?(\n.*?\\\\)*\n

but it doesn't work.

#define protected_call(_name, _obj, _method, _args...) \
try { \
    (_obj)->_method(_args); \
} \
catch (exception &e) { \
   ereport(ERROR, \
          errmsg("Error calling %s() in User Function %s at [%s:%d], error code: %d, message: %s", \
                    #_method, (_name), e.filename, e.lineno, e.errorcode, e.what()))); \
} \

catch (...) { \
   ereport(errmsg("Unexpected exception calling %s() User Function in %s", \
                    #_method, (_udsfname)))); \
}
4

2 回答 2

2
于 2013-06-14T15:32:38.317 回答
1

.*?如果您在一个模式中有多个,很容易“故障”,因此您可能需要更换

 /^\s*#.*?(?<!\\)\n/ms

 /^\s*#(?:[^\\]+|\\[^\n])*(?:\\\n(?:[^\\]+|\\[^\n])*)*/m

与为可读性添加的空格相同:

 /
    ^\s*\#
    (?: [^\\]+ | \\[^\n] )*
    (?:
       \\\n
       (?: [^\\]+ | \\[^\n] )* 
    )*
/xm

请注意,除非您确保它开始在标记之间而不是在诸如字符串文字的中间进行匹配,否则这些解决方案都不会正确工作。

  char *s = "
  #not actually a pragma
  ";
于 2013-06-15T15:26:11.637 回答