zoukankan      html  css  js  c++  java
  • C#字符串操作相关

    一、标记

    标记(tokenizing)是从文本中提取具体内容的过程。

    下面的代码从句子中提取单词,并把它们输出到控制台。

    class mytokenizing

    {

       static void Main(string[ ] args)

       {

          string mystring="I like this food,are you?";

          char[] separators={' ',',','?',':','!'};

          int startpos=0;

          int endpos=0;

          do

          {

             endpos=mystring.IndexOfAny(separators,startpos);

             if ( endpos==-1 ) endpos=mystring.Length;

             if ( endpos!=startpos )

                  Console.WriteLine(mystring.Substring( startpos,(endpos-startpos)));

             startpos=(endpos+1);

          }while(startpos<mystring.Length);

       }

    }

    I    <== 输出

    like

    this

    food

    are

    you

    二、颠倒字符串次序

    class myreverse

    {

       static void Main(string [] args)

       {

          string mystring="你们好";

          char[] mychars=mystring.ToCharArray( );

          Array.Reverse(mychars);

          Console.WriteLine(mystring);

          Console.WriteLine(mychars);

       }

    }

    任何继承于Array的类都能利用Reverse( )方法为数组中的元素重新排序。

    三、字符串的插入、删除和替换

    示例文件test.txt为字符串的来源。下面代码以Unicode格式读取文本。确保文件保存为读取时的格式。例如记事本允许将代码保存为Unicode:

    aaaaaaaa,bbbbbbbb,cccccc

    dddddddd,eeeeeeee,ffffff

    gggggggg,hhhhhhhh,iiiiii

    jjjjjjjj,kkkkkkkk,llllll

    下面代码加载数据并处理数据的测试工具。测试结果发送给控制台。

    class myprocessfile

    {

       static void Main(string [] args)

       {

          const string myName="test.txt";

          Stream readLine;

          TextWirter writeLine;

          StringBuilder sb;

          readLine=File.OpenRead(myName);

          WriteLine=Console.Out;

          StreamReader readLineSReader=new StreamReader(readLine,Encoding.Unicode);

          readLineSReader.BaseStream.Seek(0,SeekOrigin.Begin);

          while(readLineSReader.Peek()>-1)

          {

             sb=new StringBuilder(readLineSReader.ReadLine());

             //插入字符串操作语句如:sb.Append(",123"); 

             Console.WriteLine(sb.ToString());

          }

       }

    }

    在结尾添加一列内容:

    //displays aaaaaaaa,bbbbbbbb,cccccc,xxxxx

    //......

    sb.Append(",xxxxx");

    第一列可以使用下面的代码删除:

    //displays bbbbbbbb,cccccc

    //......

    sb.Remove(0,sb.ToString().IndexOf(',')+1);

    替换分隔符:

    //aaaaaaaa+bbbbbbbb+cccccc

    sb.Replace(',','+');

    添加行号(lineNumber已经在前面某处声明过为前提):

    sb.Insert(0,lineNumber.ToString("000 "));

    lineNumber++;

    //displays

    //000 aaaaaaaa,bbbbbbbb,cccccc

    //001 dddddddd,eeeeeeee,ffffff

    //002 gggggggg,hhhhhhhh,iiiiii

    //003 jjjjjjjj,kkkkkkkk,llllll

     

    字符串操作


    1、从字符串中提取子串

    StringBuilder 类没有支持子串的方法,因此必须用String类来提取。

    string mystring="My name is ynn.";

    //Displays "name is ynn."

    Console.WriteLine(mystring.Substring( 3 ));

    //Displays "ynn"

    Console.WriteLine(mystring.Substring( 11,3 ));

    2、比较字符串

    String 类有四种方法:Compare( )、CompareTo( )、CompareOrdinal( )、Equals( )。

    Compare( )方法是CompareTo( )方法的静态版本。只要使用“=”运算符,就会调用Equals( )方法,的以Equals( )方法与“=”是等价的。CompareOrdinal( )方法对两个字符串比较不考本地语言与文件。

    示例:

    int result;

    bool bresult;

    s1="aaaa";

    s2="bbbb";

    //Compare( )method

    //result值为“0”表示等,小于零表示 s1 < s2,大于零表示 s1 > s2

    result=String.Compare(s1,s2);

    result=s1.CompareTo( s2 );

    result=String.CompareOrdinal(s1,s2);

    bresult=s1.Equals( s2 );

    bresult=String.Equals( s1,s2 );

    一个例外情况是,两个字符串都是内置的,并相等,静态方法要快得多。

    3、字符串格式化

    3.1 格式化数字

    格式字符    说明和关联属性


    c、C       货币格式。

    d、D       十进制格式。

    e、E       科学计数(指数)格式。

    f、F       固定点格式。

    g、G       常规格式。

    n、N       数字格式。

    r、R       往返格式,确保将已转换成字符串的数字转换回数字时具有与原数字相同的值。

    x、X       十六进制格式。


    double val=Math.PI;

    Console.WriteLine(val.ToString( ));  //displays 3.14159265358979

    Console.WriteLine(val.ToString("E"));//displays 3.141593E+000

    Console.WriteLine(val.ToString("F3");//displays 3.142

    int val=65535;

    Console.WriteLine(val.ToString("x"));  //displays ffff

    Console.WriteLine(val.ToString("X"));  //displays FFFF

    Single val=0.123F;

    Console.WriteLine(val.ToString("p"));  //displays 12.30 %

    Console.WriteLine(val.ToString("p1"));  //displays 12.3 %

    默认格式化会在数字和百分号之间放入一个空格。定制方法如下:

    其中NumberFormatInfo类是System.Globalization命名空间的一个成员,因此该命名空间必须导入到程序中。

    Single val=0.123F;

    object myobj=NumberFormatInfo.CurrentInfo.Clone( ) as NumberFormatInfo;

    NumberFormatInfo myformat=myobj as NumberFormatInfo;

    myformat.PercentPositivePattern=1;

    Console.WriteLine(val.ToString("p",myformat)); //displays 12.30%;

    Console.WriteLine(val.ToString("p1",myformat)); //displays 12.3%;

    格式化具有很大的灵活性。下面的例子演示一个没有意义的货币结构:

    double val=1234567.89;

    int [] groupsize={2,1,3};

    object myobj=NumberFormatInfo.CurrentInfo.Clone( );

    NumberFormatInfo mycurrency=myobj as NumberFormatInfo;

    mycurrency.CurrencySymbol="#"; //符号

    mycurrency.CurrencyDecimalSeparator=":"; //小数点

    mycurrency.CurrencyGroupSeparator="_";  //分隔符

    mycurrency.CurrencyGroupSizes=groupsize;

    // 输出 #1_234_5_67:89

    Console.WriteLine(val.ToString("C",mycurrency));

    3.2 格式化日期

    输出形式取决于用户计算机的文化设置。

    using System;

    using System.Globalization;

    public class MainClass

    {

      public static void Main(string[] args) 

      {

            DateTime dt = DateTime.Now;

            String[] format = {"d","D","f","F","g","G","m","r","s","t", "T","u", "U","y","dddd, MMMM dd yyyy","ddd, MMM d \"'\"yy","dddd, MMMM dd","M/yy","dd-MM-yy",};

            String date;

          for (int i = 0; i < format.Length; i++)

          {

             date = dt.ToString(format[i], DateTimeFormatInfo.InvariantInfo);

             Console.WriteLine(String.Concat(format[i], " :" , date));

          }

         }

    }

    d :07/11/2004    <=======输出

    D :Sunday, 11 July 2004

    f :Sunday, 11 July 2004 10:52

    F :Sunday, 11 July 2004 10:52:36

    g :07/11/2004 10:52

    G :07/11/2004 10:52:36

    m :July 11

    r :Sun, 11 Jul 2004 10:52:36 GMT

    s :2004-07-11T10:52:36

    t :10:52

    T :10:52:36

    u :2004-07-11 10:52:36Z

    U :Sunday, 11 July 2004 02:52:36

    y :2004 July

    dddd, MMMM dd yyyy :Sunday, July 11 2004

    ddd, MMM d "'"yy :Sun, Jul 11 '04

    dddd, MMMM dd :Sunday, July 11

    M/yy :7/04

    dd-MM-yy :11-07-04

    3.3 格式化枚举

    enum classmen

    {

      ynn=1,

      yly=2,

      css=3,

      C++=4

    }

    获取枚举字符串信息如下:

    classmen myclassmen=classmen.yly;

    Console.WriteLine(myclassmen.ToString( ));   //displays yly

    Console.WriteLine(myclassmen.ToString("d")); //displays 2

    从系统枚举中获取文本人信息如下:

    DayOfWeek day=DayOfWeek.Friday;

    //displays "Day is Friday"

    Console.WriteLine(String.Format("Day is {0:G}",day));

    格式化字符串“ G ”把枚举显示为一个字符串。

    StringBuilder 类学习笔记

      String类的不可改变性使它更像一个值类型而不是一个引用类型。其副作用是每次执行字符操作时,都会创建一个新的String对象。StringBuilder 类解决了对字符串进行重复修改的过程中创建大量对象的问题。

    StringBuilder 类的一些属性与方法


    Length 属性并不是只读的。

    StringBuilder sb=new StringBuilder("I live the language");

    Console.WriteLine(sb.ToString( )); 

    sb.Length = 6;

    //Displays "I live"

    Console.WriteLine(sb.ToString( ));

    Capacity 属性

    描述:当前为实例分配的字符数量。默认容量是16,如果将一个字符串作为参数提供给构造函数,容量以最接近 2 的幂的值。

    MaxCapacity 属性

    描述:这个实例中可以被分配的字符最大数量。

    Append(  ) 方法

    描述:追加给定值的字符串表示。

    StringBuilder sb=new StringBuilder( );

    Console.WriteLine( sb.Capacity+"\t"+sb.Length );

    sb.Append ( 'a' , 17 )

    Console.WriteLine( sb.Capacity+"\t"+sb.Length );

    16      0 <== 输出

    32      17

    EnsureCapacity( Int capacity )  方法

    描述:如果当前容量小于指定容量,内存分配会增加内存空间以达到指定容量。

    Replace( Char oldchar,Char newchar )  方法

    描述:用newchar替换oldchar。

    Replace( String oldstring,String newstring ) 方法

    描述:用newstring替换oldstring。

    Replace( Char oldchar,Char newchar,Int  startpos,Int count ) 方法

    描述:从startpos到count-1之间用newchar替换oldchar。

    Replace( String oldstring,String newstring,Int startpos,Int count ) 方法

    描述:从startpos到count-1之间用newstring替换oldstring。

    ToString( ) 方法

    StringBuilder sb=new StringBuilder( "I live this game" );

    String s1=sb.ToString( );         //Displays "I live this game"

    String s2=sb.ToString(3,4);     //Displays "live"

    在这里第二个ToString( )方法调用了String类的Substring( )方法

    public String ToString( int startIndex,int length )

    {

      return m_StringValue.Substring( startIndex,length );

    }

     

    String 类的常用公共成员


    Compare(String s1,String s2)  静态方法

    功能:区分大小写比较。

    Compare(String s1,String s2,Bool ignoreCase)  静态方法

    功能:ignoreCase为True,不区分大小写比较。

    CompareTo(String s)      实例方法

    功能:对给定字符串与实例字符串执行一次区分大小写与文化信息比较。

    Copy(String s)            静态方法

    功能:返回一个与给定字符串同值的新的字符串。

    CopyTo(Int surceIndex,char[ ] destination,Int destIndex,Int count)

    实例方法功能:此实例中的指定位置复制到 Unicode 字符数组中的指定位置。

    参数:

    sourceIndex:此实例中的字符位置。

    destination :Unicode 字符的数组。

    destIndex :destination 中的数组元素。

    count:此实例中要复制到 destination 的字符数。

    例程:

    using System;

    public class CopyToTest {

        public static void Main() {

        string strSource = "changed";

        char [] destination = { 'T', 'h', 'e', ' ', 'i', 'n', 'i', 't', 'i', 'a', 'l', ' ', 'a', 'r', 'r', 'a', 'y' };

        Console.WriteLine( destination );

        strSource.CopyTo ( 0, destination, 4, strSource.Length );

        Console.WriteLine( destination );

        strSource = "A different string";

        strSource.CopyTo ( 2, destination, 3, 9 );

        Console.WriteLine( destination );  }

       }

    输出:

    The initial array

    The changed array

    Thedifferentarray

    EndsWith(String s)

    功能:如果实例字符串是以给定的字符串结束,就返回True。

    Equals(String s)

    功能:如果实例字符串与给定的对象具有相同的值,就返回True。

    Format(IFormatProvider provider,String format,ParamArray args)

    功能:format 的一个副本,其中格式项已替换为 args 中相应 Object 实例的 String 等效项。

    参数

    provider : 一个 IFormatProvider,它提供区域性特定的格式设置信息。

    format : 包含零个或多个格式项。

    args :包含零个或多个要格式化的对象的 Object 数组。

    例如:

    string myName = "Fred";

    String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

    固定文本是“Name =”和“, hours =”,格式项是“{0}”和“{1:hh}”,值为 myName 和 DateTime.Now。

    Replace(String oldstring,String newstring)

    功能:在实例字符串中用newstring替换所有oldstring。

    Split(char[] separator,int count)

    参数

    separator :分隔此实例中子字符串的 Unicode 字符数组、不包含分隔符的空数组或空引用。

    count :要返回的最大数组元素数。

    例如:

    string delimStr = " ,.:";

    char [] delimiter = delimStr.ToCharArray();

    string words = "one two,three:four.";

    string [] split = null;

    split = words.Split(delimiter, 4);

    foreach (string s in split)

    {

       Console.WriteLine("-{0}-", s);

    }

    one  <==输出

    two

    three

    four.

    SubString(Int startPos,Int length)

    功能:从指定位置开始返回一个指定长度的子串。

    ToString( ) 功能:返回一个对实例字符的引用。

    ToString(IFormatProvider format)

    功能:返回一个对实例字符串的引用。

     

    正则表达式学习笔记 


    一、System.Text.RegularExpression命名空间

    1、 Regex类可以用来创建正则表达式,还提供了许多方法。

    如:Regex.Replace(string input,String pattern,string replacement);

    -------RegexOption枚举

    IgnoreCase 忽略大小写。默认情况区分大小写

    RightToLeft 从右到左查找输入字符串。

    None 不设定标志。

    MiltiLine 指定^与$可以匹配行的开头和结尾,以及字符串的开头和结尾。

    SingleLine 规定特殊字符“.”匹配任一字符。换行符除外。

    例:RegexOptions.IgnoreCase

    Regex.IsMatch(Mystring,"YWSM",RegexOptions.IgnoreCase |RegexOptions.RightToLeft):

    -------(两个主要的)类构造函数

    Regex(string  pattern);

    Regex(string  pattern , RegexOption options);

    例:匹配YWSM: 

    static void Main(string[] args)

    {  Regex myRegex=new Regex("YWSM");

        System.Console.WriteLine(myregex.IsMatch("The first three letters of "+"the alphabet are YWSM"));   }

    输出:True如需设置区分大小写可用

    Regex myRegex=new Regex("YWSM",RegexOption.IgnoreCase);

    -------IsMatch( )方法

    该方法可以测试字符串,看它是否匹配正则表达式的模式。如果发现了一次匹配,返回True,否则为False。IsMatch( )有一个静态的重载方法,使用它时可以无需显式创建一个Regex对象。

    重载形式:

    public bool Regex.IsMatch(string input );

    public bool Regex.IsMatch(string input,int startat);

    public static bool Regex.IsMatch(string input,string pattern);

    public static bool Regex.IsMatch(string input,string pattern,RegexOption options);

    input: 指定了包含将检索的文本的字符串。

    sartat: 指定了搜索的起始字符位置。

    pttern: 指定将匹配的样式。

    options: 匹配行为的选项。

    例:string inputstring="Welcome to the ywicc,ywsmxy!";

        if ( Regex.IsMatch( inputstring,"ywicc",RegexOptions.IgnoreCase) )

              Console.WriteLine("Match Found");

        Else

              Console.WriteLine(" No Match Found");

    ------Replace( )方法  

    用指定的字符串代替一个匹配模式。

     ---基本方法有:

    public static string Regex.Replace(string input,string pattern,string replacement);

    public static string Regex.Replace(string input,string pattern,string replacement,RegexOption options);

    例:用"AAA"替换"BBB"的所有实例代码:

    string inputstring="Welcome to the AAA!";

    inputstring=Regex.Replace(inputstring,"BBB","AAA");

    Console.WriteLine(inputstring);

    ----非静态方法,可以指定替换次数的最大值以及开始下标:

    Public string Replace(string input,string replacement);

    Public string Replace(string input,string replacement,int count);

    Public string Replace(string input,string replacement,int count,int startat);

    例:使用XXX替换456之后的123,最多替换两次,代码如下:

    string inputstring="123,456,123,123,123,789,333";

    Regex regexp=new Regex("123");

    Inputstring=regexp.Replace(inputstring,"XXX",2,4)

    Console.WriteLine(inputstring);

    输出:123,456,XXX,XXX,123,789,333

    -------Split( )方法

    在每次发现匹配的位置拆分字符串。返回一个字符串数组。

    using System;

    using System.Text;

    using System.Text.RegularExpressions;

    using System.Windows.Forms;

    class mysplit

    {

        static void Main(string[ ] args)

       {

           string inputstring="123,456,789,ads";

           string[ ] splitResults;

           splitresults=Regex.Split(inputstring,",");

           StringBuilder resultsstring=new StringBuilder(32);

           foreach(string stringelement in splitresults)

          {

               resultsstring.Append(stringelement+"\n");

          }

          MessageBox.Show(resultsString.ToString( ));

        }

    }    

    123     <==结果

    456

    789

    ads
    -----------------------------------------------︶ㄣ九蜘蛛 感谢有耐心看到这里,最推荐一个截字符串的函数

           /// <summary>
           /// 不会因中英字符混排出现字符长短问题
           /// </summary>
           /// <param name="str"></param>
           /// <param name="strlen"></param>
           /// <param name="end"></param>
           /// <returns></returns>
           public static string cutStr(string str, int strlen, string end)
           {
               int count = 0, i;
               string tmp = "";
               for (i = 0; i < str.Length; i++)
               {
                   if (IsChinese(char.Parse(str.Substring(i, 1))))
                       count += 2;
                   else
                       count += 1;

                   if (count >= strlen)
                   {
                       try
                       {
                           tmp = str.Substring(0, i + 1) + end;
                           break;
                       }
                       catch
                       {
                           tmp = str.Substring(0, i) + end;
                           break;
                       }
                   }
                   else
                   {
                       tmp = str;
                   }
               }
               tmp = tmp.Replace("\n", "");
               return tmp;
           }

           /// <summary>
           /// 判断是否是汉字
           /// </summary>
           /// <param name="c"></param>
           /// <returns></returns>
           public static bool IsChinese(char c)
           {
               return (int)c > 0x4E00 && (int)c < 0x9FA5;
           }

  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/netwom/p/944972.html
Copyright © 2011-2022 走看看