c#字符串帮助

本文关键字:帮助 字符串 | 更新日期: 2023-09-27 18:10:54

我在c#中有一个函数,它在源文件中查找函数的名称,例如

function void MyFunc

我试图创建一个在"void"之后开始的子字符串,我需要找到函数名称的长度。函数名后面总是要有一个空格或换行符。

module MyApplication
[EntryPoint]
function void main
write("a string")
endfunction
endmodule

c#字符串帮助

您可以使用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

演示:http://www.ideone.com/64IYz

我假设函数名后面可能有其他东西,比如参数列表。

你要做的是寻找单词"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);
}

这是"哭泣使用正则表达式"。试试这个:

Regex regex = new Regex("(function void ){1,1}(?<functionName>^'w*)");

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比正则表达式更强大,但不需要任何特殊的构建时处理。在sprach主页上有一些关于这种方法的教程链接。