2011-10-11 84 views
1

我在C#中的函數,發現在源文件中,如C#字符串幫助?

function void MyFunc 

我試圖創建後「空缺」開頭的字符串函數的名字,我需要找到的長度函數的名稱。函數名稱後面總會有空格或換行符。

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

文件中的文字是什麼語言?我們可以假設名稱遵循與C#中相同的規則嗎? –

+0

你是什麼意思? – tr0yspradling

+1

@Troy:我的意思是源文件的規則是什麼?哪些字符可能出現在有效的函數名稱中?它看起來不像C#,所以我不知道我允許做什麼假設。例如,我可以假定函數名稱不能包含空格嗎? –

回答

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 

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

1

我假設函數名稱可能有其他的東西后,像一個參數列表。

你想要做的是尋找單詞「空白」,過去它,找到第一個非空格字符(這是函數名的開頭),然後去下一個空格或結束線。

您可以使用:

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); 
} 
+0

我如何從一個大的源文件中獲取該行?多行。 – tr0yspradling

+0

@ Tr0y:要逐行讀取文件,請查看「File.ReadLines」。正如'foreach(File.ReadLines(filename)中的字符串行)' –

0

這就是 「哭了使用正則表達式」。試試這個:

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

'^ \ w *'做了什麼?這不符合沒有函數名稱的行嗎?也就是'function void',沒有任何內容。你是否意指'\ w +'? –

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主頁鏈接的這種方法的一些教程。