[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(',');


我希望最後結果是給我一個陣列,但是遇到關鍵字就要拆開像是這樣

2012-10-06_230504




看一下程式碼

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();

        }
    }
}




看一下結果

2012-10-06_231327



試過很多種作法 這種作法最穩定,如果有更好的做法 可以提供給我,感謝不盡


當麻許的超技八 2014 | Donma Hsu Design.