[C#] Lia 研究篇-關於字串分離(Split)
2012-10-06
最近因為在寫Lia Language Compiler , 可以參考這邊文章 - [C#] 使用 C# 重新製作一個語言 – Lia
其中很多對文法的挑戰,所以最近有空就多看看,多研究有關於語意這件情…
遇到一個問題,乍看之下很簡單,但其實不簡單,花了我一點時間測試,我試過許多方法,至少這做法,
目前都還算是順利
假設我有一個字串 是這樣
var source = "I have [A] ,但是我很喜歡[B],至於[D]我不愛。";
我的關鍵字為
var template = "[A],[B],[C]".Split(',');
我希望最後結果是給我一個陣列,但是遇到關鍵字就要拆開像是這樣
看一下程式碼
using System; using System.Collections.Generic; using System.Linq; namespace TestSplit { class Program { static void Main(string[] args) { var template = "[A],[B],[C]".Split(','); var source = "I have [A] ,但是我很喜歡[B],至於[D]我不愛。"; var result = GetSplitListByVar(source,template); foreach (var s in result) { Console.WriteLine(s); } } /// <summary> /// 將字串中的關鍵字分離 /// </summary> /// <param name="source">母體</param> /// <param name="compareList">關鍵字群</param> /// <returns></returns> private static string[] GetSplitListByVar(string source, string[] compareList) { //先將關鍵字群,字串從大到小排序 //雖然此案例中不一定會有影響 //但是如果有取代動作則一定會有影響 //譬如 [foo] [foo2] 會被誤判 var splitStrs = source.Split(compareList.OrderByDescending(x => x.Length).ToArray(), StringSplitOptions.None); //這是很酷得作法 將上面的關鍵字群對母本進行split //並起捨棄空字串 不然關鍵字在前 會有為空的問題 var splitStrs2 = source.Split(splitStrs, StringSplitOptions.RemoveEmptyEntries); List<string> re = new List<string>(); foreach (var s in splitStrs2) { var tmp = source.Split(new string[] { s }, 2, StringSplitOptions.None)[0]; source = source.Remove(0, (tmp + s).Length); re.Add(tmp); re.Add(s); } re.Add(source); return re.ToArray(); } } }
看一下結果
試過很多種作法 這種作法最穩定,如果有更好的做法 可以提供給我,感謝不盡