/// <summary>
		/// 返回指定的字符类对应的字符类索引。
		/// </summary>
		/// <param name="charClass">要获取字符类索引的字符类。</param>
		/// <returns>字符类对应的字符类索引。</returns>
		public HashSet<int> GetCharClass(string charClass)
		{
			int cnt = charClassList.Count;
			HashSet<int> result = new HashSet<int>();
			CharSet set = GetCharClassSet(charClass);
			if (set.Count == 0)
			{
				// 不包含任何字符类。
				return result;
			}
			CharSet setClone = new CharSet(set);
			for (int i = 0; i < cnt && set.Count > 0; i++)
			{
				CharSet cc = charClassList[i];
				set.ExceptWith(cc);
				if (set.Count == setClone.Count)
				{
					// 当前字符类与 set 没有重叠。
					continue;
				}
				// 得到当前字符类与 set 重叠的部分。
				setClone.ExceptWith(set);
				if (setClone.Count == cc.Count)
				{
					// 完全被当前字符类包含,直接添加。
					result.Add(i);
					if (cc.Count > 1)
					{
						// 记录新字符类,以备之后修改。
						charClassRecord[i].Add(result);
					}
				}
				else
				{
					// 从当前的字符类中剔除被分割的部分。
					cc.ExceptWith(setClone);
					// 更新字符类。
					int newCC = charClassList.Count;
					result.Add(newCC);
					charClassList.Add(setClone);
					List<HashSet<int>> ccRecord = charClassRecord[i];
					int ccrCnt = ccRecord.Count;
					// 更新旧的字符类集合。
					for (int j = 0; j < ccrCnt; j++)
					{
						ccRecord[j].Add(newCC);
					}
					// 添加新的字符类集合。
					List<HashSet<int>> newRecord = null;
					if (setClone.Count == 1)
					{
						charClassRecord.Add(null);
					}
					else
					{
						newRecord = new List<HashSet<int>>(ccRecord);
						newRecord.Add(result);
						charClassRecord.Add(newRecord);
					}
				}
				// 重新复制 set。
				setClone = new CharSet(set);
			}
			return result;
		}
Exemple #2
0
        /// <summary>
        /// 返回指定的字符类对应的字符类索引。
        /// </summary>
        /// <param name="charClass">要获取字符类索引的字符类。</param>
        /// <returns>字符类对应的字符类索引。</returns>
        public HashSet <int> GetCharClass(string charClass)
        {
            int           cnt    = charClassList.Count;
            HashSet <int> result = new HashSet <int>();
            CharSet       set    = GetCharClassSet(charClass);

            if (set.Count == 0)
            {
                // 不包含任何字符类。
                return(result);
            }
            CharSet setClone = new CharSet(set);

            for (int i = 0; i < cnt && set.Count > 0; i++)
            {
                CharSet cc = charClassList[i];
                set.ExceptWith(cc);
                if (set.Count == setClone.Count)
                {
                    // 当前字符类与 set 没有重叠。
                    continue;
                }
                // 得到当前字符类与 set 重叠的部分。
                setClone.ExceptWith(set);
                if (setClone.Count == cc.Count)
                {
                    // 完全被当前字符类包含,直接添加。
                    result.Add(i);
                    if (cc.Count > 1)
                    {
                        // 记录新字符类,以备之后修改。
                        charClassRecord[i].Add(result);
                    }
                }
                else
                {
                    // 从当前的字符类中剔除被分割的部分。
                    cc.ExceptWith(setClone);
                    // 更新字符类。
                    int newCC = charClassList.Count;
                    result.Add(newCC);
                    charClassList.Add(setClone);
                    List <HashSet <int> > ccRecord = charClassRecord[i];
                    int ccrCnt = ccRecord.Count;
                    // 更新旧的字符类集合。
                    for (int j = 0; j < ccrCnt; j++)
                    {
                        ccRecord[j].Add(newCC);
                    }
                    // 添加新的字符类集合。
                    List <HashSet <int> > newRecord = null;
                    if (setClone.Count == 1)
                    {
                        charClassRecord.Add(null);
                    }
                    else
                    {
                        newRecord = new List <HashSet <int> >(ccRecord);
                        newRecord.Add(result);
                        charClassRecord.Add(newRecord);
                    }
                }
                // 重新复制 set。
                setClone = new CharSet(set);
            }
            return(result);
        }