我的Javascript文件包含以下形式的函数:
function xyz(a,b,c,...){
....
}
为了进行Typescript迁移,我想将它们更改为以下形式:
private xyz(a,b,c,...){
....
}
我可以使用“ function(.*)\(.*\)
”,但是如果有嵌套函数,则需要保持不变。
什么是合适的C#RegEx?
答案 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 选项