识别单个上标或下标的,怎么样改成识别连续上标或下标的?例如从识别'~'2'#''~'2'#' 到'~'22'#

.Net技术 码拜 8年前 (2016-06-08) 1185次浏览
现在做一个导入导出excel的功能,导入时遇到上标或下标用特殊字符包裹。 private string SupStart = “”~””, SupEnd = “”#””, SubStart = “”_””, SubEnd = “”#””;
例如 2为上标  存到库中就是”~”2″#”    3下标为下标 存到库中就是”_”3″#” ,假如是连续上标或下标,
例如23 以前是存成”~”2″#””~”3″#”   ,现在就要存成  “~”23″#”
导出excel时在根据标识还原成上下标,以下代码能识别出原来的单个字符标识,谁能改成识别连续上标或下标的包裹?

        //有上下标的列用
        private void SetValueSXB(string txt, ICell cell, HSSFWorkbook wk)
        {
            List<int> supList = new List<int>();
            List<int> subList = new List<int>();
            Regex regex = new Regex(SupStart + "." + SupEnd + "|" + SubStart + "." + SubEnd);
            MatchCollection matchs = regex.Matches(txt);
            foreach (Match match in matchs)
            {
                GroupCollection gc = match.Groups;
                string value = gc[0].Value;
                int len = 0;
                if (value.StartsWith(SupStart))
                {
                    supList.Add(txt.IndexOf(value));
                    len = SupStart.Length;
                }
                else
                {
                    subList.Add(txt.IndexOf(value));
                    len = SubStart.Length;
                }
                txt = ReplaceFirst(txt, value, value.Substring(len, 1));//只替换第一个
            }
            HSSFRichTextString rts = new HSSFRichTextString(txt);
            HSSFFont superscript = (HSSFFont)wk.CreateFont();
            superscript.TypeOffset = FontSuperScript.Super;//上标
            HSSFFont subscript = (HSSFFont)wk.CreateFont();
            subscript.TypeOffset = FontSuperScript.Sub;//下标
            for (int i = 0; i < supList.Count; i++)
            {
                rts.ApplyFont(supList[i], supList[i] + 1, superscript);
            }
            for (int i = 0; i < subList.Count; i++)
            {
                rts.ApplyFont(subList[i], subList[i] + 1, subscript);
            }
            cell.SetCellValue(rts);
        }
        //替换第一个出现的字符串
        private string ReplaceFirst(string txt, string oldChar, string newChar)
        {
            try
            {
                System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(oldChar);
                if (reg.IsMatch(txt))
                {
                    txt = reg.Replace(txt, newChar, 1);
                }
                return txt;
            }
            catch
            {
                return string.Empty;
            }
        }
解决方案

30

Regex regex = new Regex(SupStart + “.+?” + SupEnd + “|” + SubStart + “.+?” + SubEnd);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明识别单个上标或下标的,怎么样改成识别连续上标或下标的?例如从识别'~'2'#''~'2'#' 到'~'22'#
喜欢 (0)
[1034331897@qq.com]
分享 (0)