跳到主要內容

C#教材(13) 字串與正規表示式

字串與正規表示式


 1. 字串基本屬性與函式
  • 字串(String)類別
    字串簡單來說就是由多個字元所組成的字元集合,字串類別為核心的命名空間
    System,當你建立一個string的變數既為引用他的類別。但是在字串的宣告我們
    通常不以new關鍵字去建立字串物件,主要原因是所有資料型態都可以轉成字串
    文字,所以通常C#允許用數值型別的方式去宣告字串。
  • 字串建構子
     I. public String(char[] charValue)
    II. public String(char[], int startIndex, int length);
   III. public String(char value, int conent)
 

  • 字串運算

   字串可以利用+運算子將字串做累加的動作,直接附加到原來的文字上面。

                   string name = " jack ," ;
                   string say = " hello" ;
                   string sentence = name + say;
                   Console .WriteLine(sentence);
                                   
                                    結果:  jack ,hello

  • 字串屬性的成員
      (1) 取得字串長度
           public int Length { get ;}     
     
      (2)刪除部分字串 
          Remove(int1,int2) :從int1(起始位置)開始刪除長度為int2的字串

     (3) 插入子字串: 
           Insert(int,string) :在int的位置插入string

    (4) 取出部分字串
           Substring(int) : 從參數開始取出剩下的字串
           Substring(int1,int2) : 取出int1開始長度為int2的字串
    (5) 索引
           IndexOf(string) : 傳回第一次搜尋到字串(string)的位置
           IndexOf(string,int) : 傳回第一次搜尋到字串(string)的位置,開始搜尋位置為int
           LastIndexOf(string) : 跟IndexOf功能類似,但從後面開始搜尋
           LastIndexOf(string,int) : 跟IndexOf功能類似,但從後面開始搜尋
           Replace(char,char) : 取代字元
    (6) 其他
          ToLower() 將英文轉成小寫
          ToUpper() 將英文轉成大寫
          Trim() 刪除字串前後的空白字元
          TrimEnd() 刪除字串尾部的空白字元
          TrimStart() 刪除字串開頭的空白字元
     (7) 字串運算
           int Compare(str1, str2 ) :  str1 == str2 回傳 0 ,  str1 > str2 回傳 1 , str1 < str2 回傳 -1
           int Compare(str1, str2, boolean )    宣告為true忽略大小寫

     (8) 擷取子字串
           string[] Split(param char[] charArray)


2.動態的字串與靜態字串比較
(1) String 類別
  string 是一個很強大的類別,它可以執行很多有用的方法,但是當我們重新給定
  string的值,需要重新規劃空間給他,效率很低。

 (2)StringBuilder類別
     Import: System.Text
    StringBuilder 物件會保留自己的字串緩衝區,所有新增、刪除、或是修改都只會
    在同一塊記憶體工作,優點是減少記憶體配置的動作除非緩衝區大小不夠處理
    時,才會作記憶體重新配置,預設容量為16,超過容量時會加倍到32,上限為   
    2,147,483,647
 
    相關函式:
     
    建構子:

Name Description
StringBuilder() 初始化,預設容量為16
StringBuilder(Int32) 初始化,預設容量可指定
StringBuilder(String) 初始化,預設字串內容
StringBuilder(Int32 start , Int32  max) 初始化,預設容量和上限
StringBuilder(String context, Int32 capacity) 初始化,預設容量和上限
StringBuilder(String, Int32, Int32, Int32) 初始化,指定位址、預設容量和上限

屬性 :

Name Description
Capacity 設定或是取得字串容量
Chars 設定或是取得字串容量.
Length 設定或是取得字串長度.
MaxCapacity 設定或是取得最大容量大小

方法:


Name Description
append 設定或是取得字串容量
appendFormat 設定或是取得字串容量.
AppendLine 設定或是取得字串長度.
Clear 設定或是取得最大容量大小
CopyTo   複製
Equals(object value) 是否相等
Insert() 插入一個字串
Remove 移除
Replace(string ,string) 取代另外一個字串

Ex:


規則運算式

1.基本概念:

(1). 跳脫字元(Character Escapes)
    某些字元代表的特殊意義,例如: * 、$等等
(2).分類字元(Character Classes)
    比對某種類型的字元,例如:[0-9]會將比對輸入的字串是否為數字、[dog]會將比對輸入
    的字串是否為d、o和g的字母。
(3).數量符號: (Quantifiers)
    用以指定所套用的樣式於字串,比對字串或是字元出現的次數。Ex: 5{2}找到55的字串
(4). 規則運算(Regular Expression Options)
    搜尋以及比對樣式
(5). 置換(Substitutions)
     取代功能


2. 實作程式
Import : using System.Text.RegularExpressions;

實作下列程式:

            string testString = @"今天天氣很好,我們一起去爬山,山上有很多猴子
                                        ,那些猴子很好玩";
            Console.WriteLine(testString);
            string matchStr = @"猴子";
            Regex regex = new Regex(matchStr);
            MatchCollection collection = regex.Matches(testString);
            Console.WriteLine("比對樣式:") ;
            foreach (Match match in collection)
            {
                Console.WriteLine("樣式: {0} , 位置:{1}",match,match.Index);
            }




          string testString = @"今天天氣很好,我們一起去爬山,山上有很多猴子,
                                     那些猴子很好玩";
            Console.WriteLine(testString);
            string matchStr = @"猴?";
            Regex regex = new Regex(matchStr);
            MatchCollection collection = regex.Matches(testString);
            Console.WriteLine("比對樣式:") ;
            foreach (Match match in collection)
            {
                Console.WriteLine("樣式: {0} , 位置:{1}",match,match.Index);
            }

    將matchStr 改為下列樣式:
      string matchStr = @"天{2}";
         

    將matchStr 改為下列樣式:[好天氣猴子]只要符合好、天、氣、猴、子的樣式。
      string matchStr = @"[好天氣猴子]";

字元


Name Description
? 設定或是取得字串容量
.    設定或是取得字串容量.
xy   設定或是取得字串長度.
+ 設定或是取得最大容量大小
  複製
^ 是否相等
$ 插入一個字串
\   移除
{n}  取代另外一個字串
{n,m} 比對前一個字元至少 n 次,至多 m 次,m、n 均為正整數
[xyz]    比對中括弧內的任一個字元
[^xyz] 比對不在中括弧內出現的任一個字元
\d  數字, 等於[0-9]
\D  非數字, 等於[^0-9]
\w  數字、字母、底線 [a-zA-Z0-9_]
\W 非數字、字母、底線 [^a-zA-Z0-9_]
\s  空白字元 [ \r\t\n\f]
\S 非空白字元 [^ \r\t\n\f]

  •  Regex方法

(1) public string[] Split(string strInput)
   

格式化

(1) public static string Format(string strformat, object obj)

Name Description
C或是 c 將數值轉換為貨幣數值格式。
D或是d 可以自動補零
E或是e 科學符號
F或是f 固定點
G或是g   一般
N或是n  編號 
P或是p 格式化以百分比的格式作輸出
X或是x  十六進制  
0 利用0將空白字串填滿
# 表示數字
.  小數點
 百分比
E0    科學符號
,   千位數分隔符號

Ex:
            double d2 = 10000;
            string result = "";
            result = string.Format("{0:###,###.000}",d2);
            Console.WriteLine(result);
            result = string.Format("{0:00}", 8);
            Console.WriteLine(result);
            result = string.Format("{0:P}", 0.5);
            Console.WriteLine(result);
            result = string.Format("{0:C}", 1000.00);
            Console.WriteLine(result);



(2)日期格式化:


Name Description
簡短日期模式
D  完整日期模式
t 簡短時間模式
T   完整時間模式
f  完整可排序日期/時間模式
F     完整可排序日期/時間模式
g   一般可排序日期/時間模式
G 一般可排序日期/時間模式
M/m  日月模式
R/r   RFC1123模式
s  ISO8601模式
通用日期/時間模式
通用日期/時間模式
Y/y    年月模式
d/dd   1~31數字來顯示日期,dd則是顯示完整名稱
ddd   顯示日期的縮寫
dddd  顯示完整名稱
顯示指定DateTime物件的紀元年代
h/hh  1-12小時,hh為在1-9之間前面補零                    
H/HH 0-23小時,HH為在1-9之間前面補零   
m/mm   顯示0-59分鐘,mm 為在1-9之間前面補零         
M/MM 顯示月份1-12月,MM為在1-9之間前面補零  
MMM 顯示月份縮寫
MMMM  顯示月份完整
s/ss   0-59,ss為在1-9之間前面補零
t/tt   AM或是PM
y/yy   顯示年份,yy為在1-9之間前面補零 
yyyy  顯示完整年份
z/zz  顯示目前得時區
zzz   顯示目前完整時區
日期分隔符號
''  顯示逸出字元
'   
%c 標準格式字元 
\c 顯示下一個字元為常值

EX:
      DateTime dt = DateTime.Now;
      Console.WriteLine("格式 yyyy/MM/dd HH:mm:ss: {0:yyyy/MM/dd HH:mm:ss}",
                                   dt); //(1) 完整表示日期
      Console.WriteLine("格式: yyyy/M/d H:m:s {0:yyyy/M/d H:m:s}", dt); //(2) 簡單表示日期
      Console.WriteLine("格式: {0:000,### yyyy } ",  dt); //(3) 日期格式與其他格式混和
      Console.WriteLine("格式: {0:yyyy年MM月dd日 } ", dt); //(4) 顯示中文年月份

(1) 通常疊字dd、MM等等會將所需要的日期時間如果是個位數自動補零
(2) 通常疊字dd、MM等等會將所需要的日期時間自動補零
(3) DateTime元件只會認識自己專屬的格式不會受到混淆
(4) 顯示中文年月份




  • ToString方法
toString除了可以將基本資料轉為字串外,他也可以自訂輸出的資料格式

Ex:

   int number = 1234;
Console.WriteLine(number.ToString("000,###")); //(1) 轉為數字格式
Console.WriteLine(123.55.ToString("000,###.0000")); //(2)直接轉為
Console.WriteLine(0.5.ToString("p"));  //(3) 直接轉為百分比
























留言

這個網誌中的熱門文章

JavaBean 和POJO

前言 今天介紹JavaBean和POJO的不同,這兩個名詞在JAVA文章常常被拿來使用以及討論。在JDK1.1時候釋出才有的一個標準架構,很多時候常常被搞混,所以我們特別開闢一章來加以討論。POJO規範在企業級應用已經廣大的被使用的規範。 解釋 POJO : 全名為Plain-old-Java-object,只需要繼承Object就可以,沒有特定規定,只要建立的類別有setter/getter方法都可以稱為POJO JavaBean: JavaBean通常用來封裝多個物件成為單獨物件使用,規範比較嚴格,規則如下 規則 說明 1 需要實作序列(Serializable/Externalizable) 2 不能有參數的建構子( no-arg constructor) 3 需要有公用setter/getter 4 屬性必須要私人(private) 5 屬於特定POJO規則 比較 所有的JavaBean都為POJO,但是所有的POJO不一定為JavaBean 都可以當作重複元件 都必須序列化 特性都為可用性、易用性和持久化使用 - 應用 由圖我們可以知道POJO在應用程式中,主要用來存取資料庫資料達到持久化的目的,並提供給商業邏輯流程處理使用。這種POJO的架構提供程式人員開發時的可以很有規則將資料封裝並加以使用。 範例1. JavaBean(以員工為實例) JavaBean建立員工物件,可以發現Employee物件建構子沒有任何參數,屬性為私有化並setter/getter的命名方式。 //實作序列化 public class Employee implements java.io.Serializable{ private int id; private String name; //無參數建構子 public Employee(){} //以下實作setter/getter public void setId(int id){this.id=id;} public int getId(){return id;} public void setName(String ...

Python AI-問題集

Python AI-問題集 問題集 Jupyter Notebook執行ipywidgets會出現kernel死掉的錯誤發生(The kernel appears to have died) 解決方法 (1) 根據log檔來判斷問題: 例如:log訊息出現OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized. (2) 根據問題關鍵字找出問題所在: 利用google查詢所遭遇到的問題,例如我把上面的問題上google查詢可以找到這篇的解法 https://blog.csdn.net/bingjianIT/article/details/86182096 (3)實作解法: 我實作下面解法後,就可以順利執行手寫辨識的程式. //在Python宣告時加入 import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" 參考 https://blog.csdn.net/bingjianIT/article/details/86182096

淺談機器學習原理-Nonlinear Transform

Nonlinear Transform 淺談機器學習原理-Nonlinear Transform Nonlinear Transform *通用能力 gerneralization : 就是將訓練好的模型,放到正式環境可以正常的運作,通常Linear Model的gerneralization會比較好,因為線性模型解決的問題比較單純。缺點是應用侷限比較大。 參考Chih-Chung Chang老師的範例:縣性與非線性分類範例 https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 非線性問題 當如果今天假設要圈出裡面小圈圈的資料,我們就無法使用線性的模型,我們可以用非線性解像圈圈的方程式 s i g n ( − x 1 2 − x 2 2 + r ) sign(-x1^2-x2^2+r) s i g n ( − x 1 2 − x 2 2 + r ) 來解決,在演算法我們利用reduce來將不會的問題透過已知的問題來解決,所以在這個問題 我們將圈圈的方程式(非線性模型)reduce成線性模型來解決。 Reduce 方法論 我們調整圓形的方程式改為 z 0 z_0 z 0 ​ , z 1 z_1 z 1 ​ , z 2 z_2 z 2 ​ 來轉換線性方程式, { ( x n , y n ) } \{{(x_n,y_n)}\} { ( x n ​ , y n ​ ) } => { ( z n , y n ) } \{{(z_n,y_n)}\} { ( z n ​ , y n ​ ) } 在這空間資料中只要能找線,就可將不同的分類區分,圖中可以線性可以線去做分類。 透過向量方式來轉換成線性方程式 我們找到一個方式將非線性資料X透過向量轉換為Z後,希望透過線性方程式方式來學習,得到正解。 當我們Nonlinear transform轉換成線性方程式,當有新的資料進來我們無法使用invertiable(逆向工程)的方式去轉回非線...