一、string關(guān)鍵字與StringBuilder類
C# 字符串是使用 string 關(guān)鍵字聲明的一個字符數(shù)組。字符串是使用引號聲明的,如下例所示:
string s = "Hello, World!";
字符串對象是“不可變的”,即它們一旦創(chuàng)建就無法更改。對字符串進行操作的方法實際上返回的是新的字符串對象。因此,出于性能方面的原因,大量的連接或其他涉及字符串的操作應(yīng)當用 StringBuilder 類執(zhí)行,如下所示:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();
二、字符串使用
1、轉(zhuǎn)移字符“\”
字符串中可以包含轉(zhuǎn)義符,如“\n”(新行)和“\t”(制表符)。
如果希望包含反斜杠,則它前面必須還有另一個反斜杠,如“\\”。
2、“@”符號
@ 符號會告知字符串構(gòu)造函數(shù)忽略轉(zhuǎn)義符和分行符。
因此,以下兩個字符串是完全相同的:
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"http://www.cnblogs.com/xianspace/admin/file://my/ Documents\My Files\";
3、ToString()
如同所有從 Object 派生的對象一樣,字符串也提供了 ToString 方法,用于將值轉(zhuǎn)換為字符串。此方法可用于將數(shù)值轉(zhuǎn)換為字符串,如下所示:
int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg); // outputs "Eve was born in 1999"
另外,可以通過參數(shù)格式化ToString()的顯示輸出。如,對于時間類型格式,可以通過ToString()方法自定義時間顯示格式。如:
System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
//outputs "2009-03-11 18:05:16.345"
//"MM":指定月份為2位字符串,不足2位則前方補"0";"M":為月份數(shù)值轉(zhuǎn)換的字符串;
//"HH":表示24小時制的小時;"hh"表示12小時制的小時;
4、SubString()
格式:Substring(int startindex, int len)
用于獲取源字符串指定起始位置startindex,指定長度len的字符串。
參數(shù)Startindex索引從0開始,且最大值必須小于源字符串的長度,否則會編譯異常;
參數(shù)len的值必須不大于源字符串索引指定位置開始,之后的字符串字符總長度,否則會出現(xiàn)異常;
示例:
string s4 = "Visual C# Express";
System.Console.WriteLine(s4.Substring(7, 2)); // outputs "C#" ,C為第八個字符
System.Console.WriteLine(s4.Replace("C#", "Basic")); // outputs "Visual Basic Express"
5、Replace()
格式:Replace(string oldValue, string newValue)
用于字符串中特定字符串組合的替換,即將源字符串中的所有oldValue 字符串替換為 newValue 字符串。
示例:
string s5 = "Visual C# Express";
System.Console.WriteLine(s5.Replace("C#","VB")); // outputs "Visual VB Express"
6、Split()
將字符串拆分為子字符串(如將句子拆分為各個單詞)是一個常見的編程任務(wù)。Split() 方法使用分隔符(如空格字符)char 數(shù)組,并返回一個子字符串數(shù)組。您可以使用 foreach 訪問此數(shù)組。
示例:
char[] delimit = new char[] { ' ' };
string s14 = "The cat sat on the mat.";
foreach (string substr in s14.Split(delimit)) //使用空格拆分
{
System.Console.WriteLine(substr);
}
此代碼將在單獨的行上輸出每個單詞,如下所示:
The
cat
sat
on
the
mat.
下面的代碼示例演示如何使用 System.String.Split 方法分析字符串。此方法返回一個字符串數(shù)組,其中每個元素是一個單詞。作為輸入,Split 采用一個字符數(shù)組指示哪些字符被用作分隔符。本示例中使用了空格、逗號、句點、冒號和制表符。一個含有這些分隔符的數(shù)組被傳遞給 Split,并使用結(jié)果字符串數(shù)組分別顯示句子中的每個單詞。
示例:
1 class TestStringSplit
2
3 {
4
5 static void Main()
6
7 {
8
9 char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
10
11
12
13 string text = "one\ttwo three:four,five six seven";
14
15 System.Console.WriteLine("Original text: '{0}'", text);
16
17
18
19 string[] words = text.Split(delimiterChars);
20
21 System.Console.WriteLine("{0} words in text:", words.Length);
22
23
24
25 foreach (string s in words)
26
27 {
28
29 System.Console.WriteLine(s);
30
31 }
32
33 }
34
35 }
36
37
38
輸出:
Original text: 'one two three:four,five six seven'
7 words in text:
one
two
three
four
five
six
seven
另外,還可通過正則表達式Regex.Split()的方法,通過字符串分隔字符串。
示例:
using System.Text.RegularExpressions; //需要引用正則表達式的命名空間
string str="aaajsbbbjsccc";
string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase); //正則表達式
// RegexOptions.IgnoreCase 表示忽略字母大小寫
foreach (string i in sArray) Response.Write(i.ToString() + "<br>");
輸出:
aaa
bbb
ccc
7、Trim()
Trim() 從當前 String 對象移除所有前導(dǎo)空白字符和尾部空白字符。
示例:
string s7 = " Visual C# Express ";
System.Console.WriteLine(s7); // outputs " Visual C# Express "
System.Console.WriteLine(s7.Trim()); // outputs "Visual C# Express"
8、ToCharArray()
格式:ToCharArray(int startindex,int len)
用于將字符復(fù)制到字符數(shù)組。用于修改字符串等
示例:
string s8 = "Hello, World";
char[] arr = s8.ToCharArray(0, s8.Length);
foreach (char c in arr)
{
System.Console.Write(c); // outputs "Hello, World"
}
示例:修改字符串內(nèi)容
字符串是不可變的,因此不能修改字符串的內(nèi)容。但是,可以將字符串的內(nèi)容提取到非不可變的窗體中,并對其進行修改,以形成新的字符串實例。
下面的示例使用 ToCharArray 方法來將字符串的內(nèi)容提取到 char 類型的數(shù)組中。然后修改此數(shù)組中的某些元素。之后,使用 char 數(shù)組創(chuàng)建新的字符串實例。
class ModifyStrings
{
static void Main()
{
string str = "The quick brown fox jumped over the fence";
System.Console.WriteLine(str);
char[] chars = str.ToCharArray();
int animalIndex = str.IndexOf("fox");
if (animalIndex != -1)
{
chars[animalIndex++] = 'c';
chars[animalIndex++] = 'a';
chars[animalIndex] = 't';
}
string str2 = new string(chars);
System.Console.WriteLine(str2);
}
}
輸出:
The quick brown fox jumped over the fence
The quick brown cat jumped over the fence
9、利用索引訪問字符串中的各個字符
格式:str[int index]
示例:逆序排列字符串
string s9 = "Printing backwards";
for (int i = 0; i < s9.Length; i++)
{
System.Console.Write(s9[s9.Length - i - 1]); // outputs "sdrawkcab gnitnirP"
}
10、更改大小寫,ToUpper() 和 ToLower()
若要將字符串中的字母更改為大寫或小寫,可以使用 ToUpper() 或 ToLower()。如下所示:
string s10 = "Battle of Hastings, 1066";
System.Console.WriteLine(s10.ToUpper()); // outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s10.ToLower()); // outputs "battle of hastings 1066"
11、比較
比較兩個字符串的最簡單方法是使用 == 和 != 運算符,執(zhí)行區(qū)分大小寫的比較。
string color1 = "red";
string color2 = "green";
string color3 = "red";
if (color1 == color3)
{
System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
System.Console.WriteLine("Not equal");
}
12、CompareTo()
字符串對象也有一個 CompareTo() 方法,它根據(jù)某個字符串是否小于 (<) 或大于 (>) 另一個,返回一個整數(shù)值(小于0或大于等于0)。比較字符串時使用 Unicode 值,小寫的值小于大寫的值。示例:
string s121 = "ABC";
string s122 = "abc";
if (s121.CompareTo(s122) > 0)
{
System.Console.WriteLine("Greater-than");
}
else
{
System.Console.WriteLine("Less-than");
}
13、字符串索引 IndexOf()。
若要在一個字符串中搜索另一個字符串,可以使用 IndexOf()。如果未找到搜索字符串,IndexOf() 返回 -1;否則,返回它出現(xiàn)的第一個位置的索引(從零開始)。
示例:
string s13 = "Battle of Hastings, 1066";
System.Console.WriteLine(s13.IndexOf("Hastings")); // outputs 10 ,注意從0開始數(shù)起
System.Console.WriteLine(s13.IndexOf("1967")); // outputs -1
string 類型(它是 System.String 類的別名)為搜索字符串的內(nèi)容提供了許多有用的方法。下面的示例使用 IndexOf、LastIndexOf、StartsWith 和 EndsWith 方法。
示例:
class StringSearch
{
static void Main()
{
string str = "A silly sentence used for silly purposes.";
System.Console.WriteLine("'{0}'",str); //'A silly sentence used for silly purposes.'
bool test1 = str.StartsWith("a silly");
System.Console.WriteLine("starts with 'a silly'? {0}", test1); //starts with 'a silly'? False
bool test2 = str.StartsWith("a silly", System.StringComparison.OrdinalIgnoreCase);
System.Console.WriteLine("starts with 'a silly'? {0} (ignoring case)", test2); //starts with 'a silly'? True (ignore case)
bool test3 = str.EndsWith(".");
System.Console.WriteLine("ends with '.'? {0}", test3); //ends with '.'? True
int first = str.IndexOf("silly");
int last = str.LastIndexOf("silly");
string str2 = str.Substring(first, last - first);
System.Console.WriteLine("between two 'silly' words: '{0}'", str2); //between two 'silly' words: 'silly sentence used for '
}
}
輸出:
'A silly sentence used for silly purposes.'
starts with 'a silly'? False
starts with 'a silly'? True (ignore case)
ends with '.'? True
between two 'silly' words: 'silly sentence used for '
三、使用 StringBuilder
StringBuilder 類創(chuàng)建了一個字符串緩沖區(qū),用于在程序執(zhí)行大量字符串操作時提供更好的性能。StringBuilder 字符串還允許您重新分配個別字符,這些字符是內(nèi)置字符串數(shù)據(jù)類型所不支持的。例如,此代碼在不創(chuàng)建新字符串的情況下更改了一個字符串的內(nèi)容:
示例:
System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString()); // displays Cat: the ideal pet
System.Console.ReadLine();
在以下示例中,StringBuilder 對象用于從一組數(shù)值類型中創(chuàng)建字符串。
示例:
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789
// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];
System.Console.WriteLine(sb); // displays 9123456789
}
}
四、正則表達式
可以使用 System.Text.RegularExpressions.Regex 類搜索字符串。這些搜索可以涵蓋從非常簡單到全面使用正則表達式的復(fù)雜范圍。以下是使用 Regex 類搜索字符串的兩個示例。有關(guān)更多信息,請參見 .NET Framework 正則表達式。
以下代碼是一個控制臺應(yīng)用程序,用于對數(shù)組中的字符串執(zhí)行簡單的不區(qū)分大小寫的搜索。給定要搜索的字符串和包含搜索模式的字符串后,靜態(tài)方法 System.Text.RegularExpressions.Regex.IsMatch(System.String,System.String,System.Text.RegularExpressions.RegexOptions) 執(zhí)行搜索。
在本例中,使用第三個參數(shù)指示忽略大小寫。有關(guān)更多信息,請參見 System.Text.RegularExpressions.RegexOptions。
示例:
class TestRegularExpressions
{
static void Main()
{
string[] sentences =
{
"cow over the moon",
"Betsy the Cow",
"cowering in the corner",
"no match here"
};
string sPattern = "cow";
foreach (string s in sentences)
{
System.Console.Write("{0,24}", s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
System.Console.WriteLine(" (match for '{0}' found)", sPattern);
}
else
{
System.Console.WriteLine();
}
}
}
}
輸出:
cow over the moon (match for 'cow' found)
Betsy the Cow (match for 'cow' found)
cowering in the corner (match for 'cow' found)
no match here
以下代碼是一個控制臺應(yīng)用程序,此程序使用正則表達式驗證數(shù)組中每個字符串的格式。驗證要求每個字符串具有電話號碼的形式,即用短劃線將數(shù)字分成三組,前兩組各包含三個數(shù)字,第三組包含四個數(shù)字。這是通過正則表達式 ^\\d{3}-\\d{3}-\\d{4}$ 完成的。有關(guān)更多信息,請參見正則表達式語言元素。
示例:
class TestRegularExpressionValidation
{
static void Main()
{
string[] numbers =
{
"123-456-7890",
"444-234-22450",
"690-203-6578",
"146-893-232",
"146-839-2322",
"4007-295-1111",
"407-295-1111",
"407-2-5555",
};
string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";
foreach (string s in numbers)
{
System.Console.Write("{0,14}", s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
{
System.Console.WriteLine(" - valid");
}
else
{
System.Console.WriteLine(" - invalid");
}
}
}
}
輸出:
123-456-7890 - valid
444-234-22450 - invalid
690-203-6578 - valid
146-893-232 - invalid
146-839-2322 - valid
4007-295-1111 - invalid
407-295-1111 - valid
407-2-5555 - invalid
五、聯(lián)接多個字符串
有兩種聯(lián)接多個字符串的方法:使用 String 類重載的 + 運算符,以及使用 StringBuilder 類。+ 運算符使用方便,有助于生成直觀的代碼,但必須連續(xù)使用;每使用一次該運算符就創(chuàng)建一個新的字符串,因此將多個運算符串聯(lián)在一起效率不高。
示例:
string two = "two";
string str = "one " + two + " three";
System.Console.WriteLine(str);
盡管在代碼中只出現(xiàn)了四個字符串,三個字符串聯(lián)接在一起,最后一個字符串包含全部三個字符串,但總共要創(chuàng)建五個字符串,因為首先要將前兩個字符串聯(lián)接,創(chuàng)建一個包含前兩個字符串的字符串。第三個字符串是單獨追加的,形成存儲在 str 中的最終字符串。
也可以使用 StringBuilder 類將每個字符串添加到一個對象中,然后由該對象通過一個步驟創(chuàng)建最終的字符串。下面的示例對此策略進行了演示。
示例:
下面的代碼使用 StringBuilder 類的 Append 方法來聯(lián)接三個字符串,從而避免了串聯(lián)多個 + 運算符的弊端。
示例:
class StringBuilderTest
{
static void Main()
{
string two = "two";
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append(two);
sb.Append(" three");
System.Console.WriteLine(sb.ToString());
string str = sb.ToString();
System.Console.WriteLine(str);
}
}
==============================================================
看如下的例子:
string myStr = "I love U";
字符串轉(zhuǎn)化為字符數(shù)組ToCharArray():
char [] myChars= myStr.ToCharArray();//得到字符串的字符數(shù)組
字符串大小寫轉(zhuǎn)化ToLower() ToUpper():
myStr.ToLower();//返回一個字母轉(zhuǎn)化成小寫新串
myStr.ToUpper();//返回一個字母轉(zhuǎn)化成大寫新串
刪除字符串中指定字符Trim(<char[]>):
char[] trimChars ={'I','U'};
myStr.Trim(trimChars);//返回一個"love" 就是說刪除了字符串中指定的字符
向字符串中從左或者從右壓入字符PadLeft(<int>,<char>):
myStr.PadLeft(20);//返回新字符串=原字符串從左邊添加空格直到字符串長度達到20 還有PadRight()
myStr.PadLeft(20,'~');返回新字符串=原字符串從左邊添加指定的字符'~' 直到字符串長度達到20 還有PadRight()
將字符串根據(jù)制定的分離字符分離成字符串數(shù)組Split(<char[]>,<int>):
char[] separator={' '};
string[] newStr=myStr.Split(separator);//newStr的內(nèi)容是newStr[0]="I",newStr[1]="love",newStr[2]="U" 沒有空格,指定的拆分字符數(shù)組作為分隔符在拆分的時候不計入新的字符內(nèi)
另外Split(<char[]>,<int>)也可以指定拆分為幾個字符串