C#字符串帮助?
我在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属
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+
?