2014-10-18 43 views
0

我正在嘗試爲我的服務編寫一個迷你類型的腳本語言,並且我一直試圖從某行中的某些字符串中提取數據。例如:使用RegularExpressions解析並執行方法

!d3 Profile: {D3Api("Name")} !weather Current Weather {Weather("Location")}

與我當前的代碼工作,我似乎無法得到它找到我要找的文本。如果該行包含說{D3Api()}{Weather()}的權利,我大概可以做一個if聲明?無論如何,這是我對在查找文本{D3Api()}和檢索文字表達:

​​

它不解析或返回文本。我該如何改進?

我的設計很差的解析代碼:

public static void Main(string[] args) { 
    string t = "{D3Api(\"Name\")"; 
    String text = "(\\{D3Api\\(\"(.*?)\"\\)\\})"; 
    Regex r = new Regex(text, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
    Console.WriteLine("Parsing..\n\r"); 
    Match m = r.Match(t); 
    if (m.Success) { 
      string c = m.Groups[1].ToString(); 
      string s = m.Groups[2].ToString(); 
      Console.Write("(" + c.ToString() + ")" + "(" + s.ToString() + ")" + "\n"); 
    } 
    Console.ReadLine(); 
} 

回答

1

我不是100%確定,如果我真的回答你的問題,但我認爲你看起來有命名組。這是用(?<function>[a-zA-Z0-9]+)\((?<param>[^)]\)這樣的正則表達式來完成的。有了這個,你可以爲你的函數名稱設置一個通用格式並且只需要一個參數。有關已命名組的更多信息,請參閱here

順便說一句,如果您的語言比較複雜,那麼您可能會發現RegEx不足以滿足您的需求。在這種情況下,我建議看看使用EBNF創建自定義語法,然後創建一個標記器(非常有趣的項目IMO)。可以看到一個例子:here

+0

這就是我一直在尋找的東西,EBNF似乎是我想要完成的最合適的!謝謝! – 2014-10-18 19:03:23

0

您不使用量詞。您可以使用*這意味着匹配以前的令牌0或更多次。

String text = "(\\{D3Api\\(\"(.*?)\"\\)\\})"; 
Regex r = new Regex(text , RegexOptions.IgnoreCase | RegexOptions.Singleline); 

做好以上後,你可以,如果你想多場比賽做使用Regex.MatchMatches

+0

它在我的正則表達式測試程序中沒有顯示任何匹配。我可以錯過令牌嗎?我試圖在'{D3Api(「Name」)}'中獲得'Name'參數。我添加了解析器代碼以反映您的答案。 – 2014-10-18 18:07:43

+0

@BrandonPalmer http://regex101.com/r/qJ1hX7/1。我在c#中使用了''''和'\',因爲這是必要的。 – 2014-10-19 03:58:57

+0

謝謝先生!但是我決定使用「反諷」,併爲這種類型的東西製作自己的語言new Command(「Hello this is the API {D1}「,D3Api(String)); – 2014-10-20 14:33:18