正则表达式,仅会更改顶级函数声明

时间:2019-02-24 22:03:42

标签: c# regex

我的Javascript文件包含以下形式的函数:

function xyz(a,b,c,...){
....
}

为了进行Typescript迁移,我想将它们更改为以下形式:

private xyz(a,b,c,...){
....
}

我可以使用“ function(.*)\(.*\)”,但是如果有嵌套函数,则需要保持不变。

什么是合适的C#RegEx?

3 个答案:

答案 0 :(得分:0)

匹配: function (.+{.*(.*{(?2)}.*)*.*?})的multiline参数已打开

然后替换为: private \1

此RegEx完全匹配该函数,包括任何嵌套函数/ if语句等,因此您只能替换最外面的一个。

说明

function                Matches function keyword
         (              Starts capture group
          .+            Matches function name and parameters
            {           Opens function
             .*         Matches any code in function
               (        Starts new capture group (2) for catching internal curly braces
                .*      Matches any code in function
                  {     Matches opening curly brace
                   (?2) Matches capture group (2), to match any code and curly braces inside
                  }     Matches closing curly brace
                .*      Matches any code
              )*        Closes capture group (2) and allows it to be repeated
           .*?          Matches any code, until next curly brace
          }             Matches closing curly brace
         )              Closes capture group

请注意,默认情况下.net不支持递归((?2)),因此您必须对C#使用另一个RegEx-Engine,例如PCRE for .Net

如果您不想使用其他引擎,则可以将(?2)(.*{(?2)}.*)*递归替换为所需的深度,以匹配嵌套的if循环等,最后替换{ {1}}与(?2)。 结果应如下所示: .*

答案 1 :(得分:-1)

它可能和匹配一样简单:

/^function/gm

提供的顶层函数没有缩进(demo)。或者,如果将它们缩进一个标签或4个空格,则可以使用:

/^\tfunction/gm    or    /^    function/gm

这使用行锚(^)的开头。

答案 2 :(得分:-2)

这将为您工作

 var src = @"function xyz(a,b,c,...){
   function abc(){
   }
 }";  
 var pattern = @"\s*function\s*(?=\w+\(\w+|,\)\s*\{.+?})";

var result = Regex.Replace(src, pattern, "private ", RegexOptions.Multiline);
result.Dump();

选中This

PS:您需要启用 MultiLine 选项