zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c#对字符串操作的技巧小结

c# 操作 技巧 字符串 小结
2023-06-13 09:14:49 时间
字符串是由类定义的,如下
1publicsealedclassString:IComparable,ICloneable,IConvertible,IComparable<string>,IEnumerable<char>,IEnumerable,IEquatable<string>
注意它从接口IEnumerable<char>派生,那么如果想得到所有单个字符,那就简单了,
1List<char>chars=s.ToList();
如果要对字符串进行统计,那也很简单:
1intcn=s.Count(itm=>itm.Equals("{"));
如果要对字符串反转,如下:
1newstring(s.Reverse().ToArray());
如果对字符串遍历,那么使用扩展方法ForEach就可以了。
现在有一个需求,对一个list的字符串,我想对满足某些条件的进行替换,不满足条件的保留下来。问题来了,在forach的时候不能对字符串本身修改。因为msdn有如下的描述:
AStringobjectiscalledimmutable(read-only)becauseitsvaluecannotbemodifiedonceithasbeencreated.MethodsthatappeartomodifyaStringobjectactuallyreturnanewStringobjectthatcontainsthemodification.
所以如下代码其实是构造了两个字符串:
1stringst="Hello,world";
2st="Hello,world2";
回到那个问题,我想一个很简单的方法是先构造一个List<string>,然后对原字符串遍历,满足条件的修改后加入新的list,不满足的直接加入。这种方法很简单原始,效率也是最高的。Linq里面有UNION这个关键字,sql里面也有UNION这个集合操作,那么把它拿来解决这个问题如下:
复制代码代码如下:

  privateList<String>StringCleanUp(List<string>input)
        {
            Regexreg=newRegex(@"\<(\w+)\>(\w+?)\</\1\>",RegexOptions.Singleline);
  
            varmatchItem=(
                    fromcininput
                    wherereg.IsMatch(c)
                    selectreg.Replace(c,matchEvaluator)
                ).Union(
                    fromcininput
                    where!reg.IsMatch(c)
                    selectc
                );
  
            returnmatchItem.ToList<string>();
        }
  
        privatestringmatchEvaluator(Matchm)
        {
            returnm.Groups[2].Value;
        }

以上是用正则表达式进行匹配,如果匹配,用匹配的组2的信息替换原信息。如果不匹配,使用原字符串。
如果问题敬请指出。