/// <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; }
/// <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); }