2019年6月3日 星期一

[轉貼] Regular Expression自學筆記

出處:https://dotblogs.com.tw/michaelfang/2017/03/18/regex

實戰使用c# Regex的筆記

說明: https://goo.gl/RsQHtp

線上驗證
https://regex101.com/

常用語法說明

特殊字元
\   : 後面為特殊符號 ,e.g  \\ 代表\  ,  \n 代表 換行, \( 代表(
^  : 字串開始
$ : 字串結尾
. : 任何字元 除了\n

開頭 與結尾

(?=Pattern) : 前面為pattern       , e.g   Patternabc
(?<=Pattern): 後面為pattern    , e.g    abcPattern

集合及字元
[abc] : 字元集合, e.g [a-zA-Z]  :英文大小寫
[^a-z]: 非a-z , e.g  ABCdefGH  ==>  [^a-z]  ==> ABC 與  GH
\d : 數字 ,e.g   ABC123DEF==>[\d]*  ==>123
\D:非數字,e.g  ABC123DEF ==>[\D]* ==>ABC 與 DEF
\s : 一個空白字元
\S: 非空白字元
\w: 單詞字元(a-z,A-Z,0-9,_)  ,e.g New York -->\w+==>  New 與 York
\W:非單詞字元


出現次數
* :0~n次 
+ : 1~n次
?:  0-1次
{n}:n次
{n,m} :n~m次
優先順序:
 1.  \
2.  ()  (?=) ..[]
3.  * + ?   {n,m}
4. ^ $
5.  | 




範例1:取出 夾在S1 與S2字串中間的 文字
/stexh/H000499?pa=000242102131000499&p_cate=all
欲取出:H000499?pa=000242102131000499
string pattern = @"(?<=\/stexh\/)(.*)(?=&p_cate=all)";

Match match = Regex.Match(categoryUrl, pattern);
 if (match.Success)
 {
                 Group g=match.Groups[0];
                  categoryID = g.ToString();
}


範例2:取出金額數字
9折:特價100元
        /// <summary>
        /// 傳入:strPrice=售價:100.00 元
        /// 傳入:strPrice=建議售價:1,280
        /// 測試by: https://regex101.com/r/I1LEwC/2   
        /// 預設抓最後一個價格
        /// </summary>
        /// <param name="strOriPrice"></param>
        /// <param name="firstPrice">false</param>
        /// <returns></returns>
        public static decimal RegexPrice(string strOriPrice,bool firstPrice=false )
        {         
            decimal price;
            string strPrice;
            strPrice = Regex.Replace(strOriPrice, ",", "");            
            //抓最後一個價格                 
            MatchCollection matches=Regex.Matches(strPrice, @"\d+([.]\d+)?");
            int count = 0;
            foreach(Match match in matches)
            {                   
                strPrice = match.Value;                
                if (strPrice != "")
                {                        
                    count++;
                    if ((count ==1) && (firstPrice))
                    {
                        break;
                    }
                }
            }

            decimal.TryParse(strPrice, out price);
            return price;
        }
範例3:
移除html
 
        public static string  RegexNoHtml(this string originalString)
        {
            string regex = @"(<.+?>|&nbsp;)";
            var result = Regex.Replace(originalString, regex, "").Trim();
            return result;
        }