星期三, 9月 12, 2018

[C#]正規表示式Regular Express練習

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace RegexpMatches
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "123456789<td noWrap>    現金及約當現金</td><td align='right'>                696,660</td><td align='right'>                517,106</td><td align='right'> ";
            string text4 = "ABC<td noWrap>    現金及約當現金</td><td nowrap align=right>              -1,466,272.123<tr class='even'><td nowrap> 提列法定盈餘公積<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                 18,413<td nowrap align=right><td nowrap align=right>                -18,413<td nowrap align=right>                              0<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                              0<td nowrap align=right><td nowrap align=right>                              0<tr class='odd'><td nowrap> 普通股現金股利<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                              0<td nowrap align=right>                              0<td nowrap align=right>               -153,705<td nowrap align=right>               -153,705<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>               -153,705<td nowrap align=right><td nowrap align=right>               -153,705<tr class='even'><td nowrap> 特別盈餘公積迴轉<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                 -1,886<td nowrap align=right>                  1,886<td nowrap align=right>                              0<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                              0<td nowrap align=right><td nowrap align=right>                              0<tr class='odd'><td nowrap> 本期淨利(淨損)<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                103,141<td nowrap align=right>                103,141<td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right><td nowrap align=right>                103,141<td nowrap align=right>                              0<td nowrap align=right>                103,141<tr class='even'><td nowrap>";
            string text5 = "<td noWrap>    現金及約當現金</td><td nowrap align=right>              -0.567<tr class='even'><td nowrap>";
            string text6 = "<td noWrap>    現金及約當現金</td><td nowrap align=right>              -123.567<tr class='even'><td nowrap>";
            string text7 = "<td noWrap>    現金及約當現金</td><td nowrap align=right>              0 <tr class='even'><td nowrap>";
            //string pattern = "現金及約當現金</td>"; //OK
            //string pattern = @"<td\s*\w*>\s+現金及約當現金\s*<\s*/\s*td>"; //OK
            string Find = "現金及約當現金";
            string pattern = @"<td\s*\w*>\s+" + Find + @"\s*<\s*/\s*td\s*>";  //前面有 <td XXX>與多個空白,後面有</td>
            Match match = Regex.Match(text, pattern);
            GroupCollection groups = match.Groups;
            Console.WriteLine("   " + match.Value);
            Console.WriteLine("'{0}' repeated at positions {1} and {2}",
                              groups["word"].Value,
                              groups[0].Index,
                              groups[1].Index);
            Int32 sPOS = text.IndexOf(match.ToString());
            Console.WriteLine("Find at : " + sPOS);
             string text2 = text.Substring(match.Length);
            //string pattern2 = @"<td\s*\w*>\s+\d,*\d";  // NG
            //string pattern2 = @"<td\s*\w*";  //OK
             string pattern2 = @"(<td.*>)?"; // 非貪婪
            //string pattern2 = @"<td\s*\w*";  //O
            Match match2 = Regex.Match(text2, pattern2);
            Console.WriteLine("   " + match2.Value);
            groups = match2.Groups;
           /*
            Console.WriteLine("'{0}' repeated at positions {1} and {2}",
                              groups["word"].Value,
                              groups[0].Index,
                              groups[1].Index);
            * */
            sPOS = text2.IndexOf(match2.ToString());
            Console.WriteLine("Find at : " + sPOS);
           
            //string pattern3 = @"\d+,\d*"; //OK
            //string pattern3 = @"-*\d+[,\d*]{1,}"; //OK
            //string pattern3 = @"-*\d+[,\d*]{0,}\.*\d*"; //
            //string pattern3 = @"-*\d+[,\d*]{0,}\d*"; //OK
            string pattern3 = @"-*[0-9]+[,\d*]{0,}\.*\d*"; //
            Match match3 = Regex.Match(text2, pattern3);
            if (match3 == null)
            {
                pattern3 = @"-*[0-9]+.\d+"; // 小數
                match3 = Regex.Match(text2, pattern3);
            }
            Console.WriteLine("   " + match3.Value);

            match3 = Regex.Match(text4, pattern3);
            Console.WriteLine("   " + match3.Value);
           // pattern3 = @"-*[0-9]+\.*\d*"; // 小數
           // pattern3 = @"-[0-9]+[,\d*]{0,}\.*\d*"; //OK
            match3 = Regex.Match(text5, pattern3);
            Console.WriteLine("   " + match3.Value);
            match3 = Regex.Match(text6, pattern3);
            Console.WriteLine("   " + match3.Value);
            match3 = Regex.Match(text7, pattern3);
            Console.WriteLine("   " + match3.Value);
            groups = match3.Groups;
            Console.WriteLine("'{0}' repeated at positions {1} and {2}",
                              groups["word"].Value,
                              groups[0].Index,
                              groups[1].Index);
            sPOS = text2.IndexOf(match3.ToString());
            Console.WriteLine("Find at : " + sPOS);
        }
        //<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

    }
}

沒有留言: