我在C#中有一个函数,它在源文件中找到函数的名称,例如
function void MyFunc
我正在尝试创建一个在“void”之后开始的子字符串,我需要找到函数名称的长度。函数名后面总会有空格或换行符。
module MyApplication
[EntryPoint]
function void main
write("a string")
endfunction
endmodule
答案 0 :(得分:1)
您可以使用LastIndexOf
查找最后一个空格,并获取后面的字符串部分以获取函数名称。然后使用Length
属性获取代码的长度:
var s = "function void MyFunc "; // example string
var s2 = s.Trim(); // remove any extra spaces at the end
var funcName = s2.Substring(s2.LastIndexOf(' ') + 1); // 'MyFunc'
var length = funcName.Length; // 6
答案 1 :(得分:1)
我认为函数名可能包含其他内容,如参数列表。
你想要做的是寻找单词“void”,经过它,找到第一个非空格字符(这是函数名称的开头),然后转到下一个空格或行尾
您可以使用:
const string LookFor = "void "; // note space at end.
string GetFunctionName(string line)
{
int voidPos = line.IndexOf(LookFor);
if (voidPos == -1)
return null;
int functionStart = voidPos + LookFor.Length;
int spacePos = line.IndexOf(' ', functionStart);
if (spacePos == -1)
spacePos = line.Length;
return line.Substring(functionStart, spacePos - functionStart);
}
答案 2 :(得分:0)
那是“为使用正则表达式而哭泣”。试试这个:
Regex regex = new Regex("(function void ){1,1}(?<functionName>^\w*)");
答案 3 :(得分:0)
Sprache可以这样做,但你需要为整个文件编写一个语法,因为它没有实现“搜索”匹配。
这些内容中的某些内容将解析只是函数声明 - 如上所述,为了使您的场景工作,您需要为模块添加规则等等。
var identifier = (from first in Parse.Letter
from rest in Parse.LetterOrDigit.Many().Text()
select first + rest).Token();
var returnType = Parse.String("void").Or(Parse.String("int")).Token();
var functionKeyword = Parse.String("function").Token();
var endFunctionKeyword = Parse.String("endfunction").Token();
var function = from fk in functionKeyword
from rt in returnType
from functionName in identifier
from body in Parse.AnyChar.Until(endFunctionKeyword)
select functionName;
var name = function.Parse("function void main write(\"a string\") endfunction");
上面的变量name
将包含字符串"main"
(除非我做了一些拼写错误:))
Sprache比正则表达式更强大,但不需要任何特殊的构建时处理。 Sprache主页上有一些关于这种方法的教程。