none
尋找並取代後面數字 RRS feed

  • 問題

  • 請問一下各位高手

    我已寫了一個 可以搜尋到Z 且把Z後面增加一些字如下面程式

    但如果我要搜尋到Z 後面的數字 且把數字乘上一方程式 我的下方程式因該如何做更改? 或是能參考哪篇文章

    ASDC6XZ10      
    SSF11EWQ
    SAVVSS
    GRWW QD
    Z10XADWR

    變成下方(Z後面的10乘上了12)

    ASDC6XZ120
    SSF11EWQ
    SAVVSS
    GRWW QD
    Z120XADWR

    我的程式如下

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Text.RegularExpressions;


    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            string savefile;//存檔用
            StreamWriter sw;//存檔用
            string line;//讀取檔案


            private void button1_Click(object sender, EventArgs e)
            {
                {
                    //建立讀檔功能
                    Stream myStream = null;
                    OpenFileDialog openFileDialog1 = new OpenFileDialog();
                    openFileDialog1.InitialDirectory = "c:\\";
                    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                    openFileDialog1.FilterIndex = 2;
                    openFileDialog1.RestoreDirectory = true;

                    //確認是否成功開啟讀檔功能
                    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        try
                        {
                            if ((myStream = openFileDialog1.OpenFile()) != null)//確認讀檔功能是否正常
                            {
                                using (myStream)
                                {
                                    string path = openFileDialog1.FileName;//記錄讀檔名稱
                                    StreamReader sr = new StreamReader(path);//讀檔功能
                                    savefile = @Application.StartupPath + "\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".txt";//設定存檔位置
                                    sw = new StreamWriter(savefile, true);//設定存檔於同一位置

                                    while (!sr.EndOfStream)//當讀取檔案的文件沒問題時進行後續分析
                                    {
                                        line = sr.ReadLine();//開始進行每行讀取

                                        if (line.Contains("Z"))//確認是否有大寫Z存在
                                        {
                                            string www = Convert.ToString(line.IndexOf("Z"));//找Z的位置
                                            string strTarget = line.Insert(line.IndexOf("Z") + 1, "GOOD");//在Z的後面加入GOOD
                                            label1.Text += strTarget + "\n";//顯示結果在LABEL1
                                            sw.WriteLine(strTarget);//將修改後的結果寫入檔案
                                        }
                                        else
                                        {
                                            label1.Text += line + "\n";//將不含Z的程式顯示在LABEL1
                                            sw.WriteLine(line);//將不含Z的程式寫入檔案
                                        }

                                    }
                                    sw.Close();//關閉寫入檔案
                                }
                            }
                        }
                        catch (Exception ex)//讀取時找不到檔案顯示如下
                        {
                            MessageBox.Show("找不到正確檔案" + ex.Message);
                        }
                    }

                }
            }

            private void label1_Click(object sender, EventArgs e)
            {

            }
        }
    }

                                                                     
    2014年11月20日 上午 06:20

解答

  • 您好,
    或許可以透過 Regex.Replace 方法 來取出 Z數值 的字串,來進行運算!

    類似如下的方式,請依您需要的調整。

    //using System.Text.RegularExpressions;
    static void Main(string[] args)
    {
    	List<string> testLists = new List<string>() { 
    	"ASDC6XZ10"      
    	,"SSF11EWQ"
    	,"SAVVSS"
    	,"GRWW QD"
    	,"Z10XADWR"
    	};
    	Console.WriteLine("*** Before ***");
    	foreach (string s in testLists)
    	{
    		Console.WriteLine(s);
    	}
    	Console.WriteLine("*** After ***");
    	foreach (string s in testLists)
    	{
    		Console.WriteLine(ZMultiply(s));
    	}
    	Console.ReadKey();
    }
    
    
    static string ZMatchReplace(Match m)
    {
    	string result = m.ToString();
    	string zSubPattern = @"\d+";
    	Regex rx = new Regex(zSubPattern);
    	result = rx.Replace(result, new MatchEvaluator(ZMatchReplaceDigi));
    	return result;
    }
    
    static string ZMatchReplaceDigi(Match m)
    {
    	string result = m.ToString();
    	decimal digiValue = 0;
    	decimal.TryParse(result, out digiValue);
    	//要乘的數值
    	const int multiplyValue = 12;
    	return (digiValue * multiplyValue).ToString();
    }
    
    static string ZMultiply(string orgValue)
    {
    	//找出ZDDD的的字串
    	string zPattern = @"[z][0-9]+";
    	Regex rx = new Regex(zPattern, RegexOptions.IgnoreCase);
    	//將找到的字串replace
    	string result = rx.Replace(orgValue, new MatchEvaluator(ZMatchReplace));
    	return result;
    }



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 newmanstan 2014年11月21日 上午 03:02
    2014年11月20日 上午 07:41

所有回覆

  • .NET Framework 規則運算式

    http://msdn.microsoft.com/zh-tw/library/hs600312%28v=vs.110%29.aspx

    String.Substring 方法 (Int32, Int32)

    http://msdn.microsoft.com/zh-tw/library/aka44szs(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

    Convert 類別

    http://msdn.microsoft.com/zh-tw/library/system.convert%28v=vs.110%29.aspx

    如果數字長度有固定,可以用Substring取出數字,Convert轉換為數字來運算,再轉回字串存檔...

    2014年11月20日 上午 06:34
  • 您好,
    或許可以透過 Regex.Replace 方法 來取出 Z數值 的字串,來進行運算!

    類似如下的方式,請依您需要的調整。

    //using System.Text.RegularExpressions;
    static void Main(string[] args)
    {
    	List<string> testLists = new List<string>() { 
    	"ASDC6XZ10"      
    	,"SSF11EWQ"
    	,"SAVVSS"
    	,"GRWW QD"
    	,"Z10XADWR"
    	};
    	Console.WriteLine("*** Before ***");
    	foreach (string s in testLists)
    	{
    		Console.WriteLine(s);
    	}
    	Console.WriteLine("*** After ***");
    	foreach (string s in testLists)
    	{
    		Console.WriteLine(ZMultiply(s));
    	}
    	Console.ReadKey();
    }
    
    
    static string ZMatchReplace(Match m)
    {
    	string result = m.ToString();
    	string zSubPattern = @"\d+";
    	Regex rx = new Regex(zSubPattern);
    	result = rx.Replace(result, new MatchEvaluator(ZMatchReplaceDigi));
    	return result;
    }
    
    static string ZMatchReplaceDigi(Match m)
    {
    	string result = m.ToString();
    	decimal digiValue = 0;
    	decimal.TryParse(result, out digiValue);
    	//要乘的數值
    	const int multiplyValue = 12;
    	return (digiValue * multiplyValue).ToString();
    }
    
    static string ZMultiply(string orgValue)
    {
    	//找出ZDDD的的字串
    	string zPattern = @"[z][0-9]+";
    	Regex rx = new Regex(zPattern, RegexOptions.IgnoreCase);
    	//將找到的字串replace
    	string result = rx.Replace(orgValue, new MatchEvaluator(ZMatchReplace));
    	return result;
    }



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 newmanstan 2014年11月21日 上午 03:02
    2014年11月20日 上午 07:41
  • 不好意思 在請問下 如果我z後面是10.111

    string zPattern = @"[z][0-9]+"; 那這部分因該改怎改才會連小數點後的數字一起乘

    2014年11月20日 上午 09:39
  • 您好,
    我參考以下的link,

    http://stackoverflow.com/questions/5570820/regex-allow-digits-and-a-single-dot

    改成
    static string ZMatchReplace(Match m)
    {
        string result = m.ToString();
        string zSubPattern = @"[\d+(\.\d+)]+[\d+]+";
        Regex rx = new Regex(zSubPattern);
        result = rx.Replace(result, new MatchEvaluator(ZMatchReplaceDigi));
        return result;
    }
    static string ZMultiply(string orgValue)
    {
        string zPattern = @"[z][\d+(\.\d+)]+[\d+]+";
        Regex rx = new Regex(zPattern, RegexOptions.IgnoreCase);
        string result = rx.Replace(orgValue, new MatchEvaluator(ZMatchReplace));
        return result;
    }
    您要再試看看是否OK哦! 或再參考其他Regex的pattern方式,以符合您的需求哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年11月20日 上午 10:23
  • 不好意思 在請問下  如果我只想讀小寫英文  或大寫英文 有辦法嗎  那這string zPattern = @"[z][\d+(\.\d+)]+[\d+]+";要怎改
    2014年11月21日 上午 08:55
  • 您好,
    目前是不分大小寫,所以 RegexOptions.IgnoreCase ,您可以用區分大小寫,不要指定 RegexOptions.IgnoreCase

    // 不分大小寫,請用 RegexOptions.IgnoreCase Regex rx = new Regex(zPattern, RegexOptions.IgnoreCase);
    Regex rx = new Regex(zPattern);


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年11月24日 上午 06:40
  • 感謝大大 指導
    2014年11月24日 上午 08:33
  • 後來那個pattern我使用 [z]\d+(\.\d+)?

    你可以試看看哦!



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年11月24日 上午 08:58