C#字符串帮助?

C#字符串帮助?,c#,string,parsing,C#,String,Parsing,我在C#中有一个函数,它在源文件中查找函数名,例如 function void MyFunc 我正在尝试创建一个从“void”之后开始的子字符串,我需要找到函数名的长度。函数名后面总是有空格或换行符 module MyApplication [EntryPoint] function void main write("a string") endfunction endmodule 您可以使用LastIndexOf查找最后一个空格,并获取下面字符串的一部分以获取函数名。然后使用Length属

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

function void MyFunc
我正在尝试创建一个从“void”之后开始的子字符串,我需要找到函数名的长度。函数名后面总是有空格或换行符

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

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

演示:

我假设函数名后面可能有其他内容,比如参数列表

您要做的是查找单词“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*)");
Regex Regex=newregex(“(函数void){1,1}(?^\w*)”;
可以做到这一点,但您需要为整个文件编写语法,因为它不实现“搜索”匹配项

沿着这些思路的东西将只解析函数声明——如上所述,为了使您的场景工作,您需要为模块添加规则等等

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主页上链接了一些关于这种方法的教程。

文件中的文本是什么语言?我们可以假设名称遵循与C#中相同的规则吗?@Troy:我的意思是源文件的规则是什么?有效函数名中可能出现哪些字符?它看起来不像C#,所以我不知道我可以做出什么样的假设。例如,我可以假设函数名不能包含空格吗?哦,对不起,这是我现在正在创建的一种自定义语言,我正在为它编写一个简单的解析器,是的,名称中没有空格。如何从一个大的源文件中获取行?有多行。@Tr0y:要逐行读取文件,请查看
file.ReadLines
。正如在
foreach(File.ReadLines(filename)中的字符串行)中一样,
^\w*
做什么?这不匹配没有函数名的行吗?也就是说,
函数void
,后面没有任何内容。你是说
\w+