none
從字串中找出IP位子。 RRS feed

  • 問題

  • Dear Sir.

    我想請問一個問題,

    string aa = "insert into CellCfgTbl (EqpTyp,EID,PortTyp,PortPath,Protocol,DevID,ComLnk,Assoc,PmpID,Link,IO,Group,Grid,ActiveReCon,BAUD,DUPBLKDET,MULT,RTY,T1,T2,T3,T4,T5,T6,T7,T8,TRACE,TRACEOnOff,SemiP,EqpTblKey,RecipePath,LOC,MID) values ('PRCU0000','ProCu','IP','127.0.0.1:5000','HSMS','0','0','NA','ACTIVE','CLIENT','X','Group Name','50 175','1','19200','1','0','3','500','10000','45000','45000','10000','5000','10000','5000','440C','1','2','ProCu.4-43A-1.PRCU0000','C:/KNetRecipes/ProCu','','')"

    上方這個字串,我只想解出127.0.0.1這個IP格式,後面:5000不要。

                    string anyString = Regex.Replace(aa ,"\'" ,"");

                    string[] a = anyString.Split(',');
                    var sel = from ss in a
                              where ss.Length >= 9 && ss.Length <= 16
                              select ss;
                    foreach (var e in sel)
                    {
                        Console.WriteLine(e.ToString());
                    }

    我這個方法得到的結果是

    有解出

    "ActiveReCon"

    "DUPBLKDET"

    "TRACEOnOff"

    "EqpTblKey"

    "RecipePath"

    "127.0.0.1:5000"

    "Group Name"

    請問各位大大,我要怎麼用才能找出我要的127.0.0.1呢?

    怎麼下條件才能夠照我的需求的格式呢?

    是用Regex.Matches嗎?

    麻煩各位先進指點一下

    感恩。

    2013年11月5日 上午 05:53

解答

  • 您好,

    使用Uri及IPAddress去TryParse,如下,希望對您有幫助!

    string aa = "insert into CellCfgTbl (EqpTyp,EID,PortTyp,PortPath,Protocol,DevID,ComLnk,Assoc,PmpID,Link,IO,Group,Grid,ActiveReCon,BAUD,DUPBLKDET,MULT,RTY,T1,T2,T3,T4,T5,T6,T7,T8,TRACE,TRACEOnOff,SemiP,EqpTblKey,RecipePath,LOC,MID) values ('PRCU0000','ProCu','IP','127.0.0.1:5000','HSMS','0','0','NA','ACTIVE','CLIENT','X','Group Name','50 175','1','19200','1','0','3','500','10000','45000','45000','10000','5000','10000','5000','440C','1','2','ProCu.4-43A-1.PRCU0000','C:/KNetRecipes/ProCu','','')";
    string anyString = Regex.Replace(aa ,"\'" ,"");
    string[] a = anyString.Split(',');
    var sel = from ss in a
    			where ss.Length >= 9 && ss.Length <= 16
    			select ss;
    Uri url;
    IPAddress ip;
    foreach (var s in sel)
    {
    	if(Uri.TryCreate(string.Format("http://{0}", s), UriKind.Absolute, out url))
    	{
    		if(IPAddress.TryParse(url.Host, out ip)){
    			//合法的IP
    			Console.WriteLine(ip.ToString()); 
    		}
    	}
    }


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

    • 已標示為解答 黑小胡 2013年11月6日 上午 12:12
    2013年11月5日 上午 10:54

所有回覆

  • 您好,

    使用Uri及IPAddress去TryParse,如下,希望對您有幫助!

    string aa = "insert into CellCfgTbl (EqpTyp,EID,PortTyp,PortPath,Protocol,DevID,ComLnk,Assoc,PmpID,Link,IO,Group,Grid,ActiveReCon,BAUD,DUPBLKDET,MULT,RTY,T1,T2,T3,T4,T5,T6,T7,T8,TRACE,TRACEOnOff,SemiP,EqpTblKey,RecipePath,LOC,MID) values ('PRCU0000','ProCu','IP','127.0.0.1:5000','HSMS','0','0','NA','ACTIVE','CLIENT','X','Group Name','50 175','1','19200','1','0','3','500','10000','45000','45000','10000','5000','10000','5000','440C','1','2','ProCu.4-43A-1.PRCU0000','C:/KNetRecipes/ProCu','','')";
    string anyString = Regex.Replace(aa ,"\'" ,"");
    string[] a = anyString.Split(',');
    var sel = from ss in a
    			where ss.Length >= 9 && ss.Length <= 16
    			select ss;
    Uri url;
    IPAddress ip;
    foreach (var s in sel)
    {
    	if(Uri.TryCreate(string.Format("http://{0}", s), UriKind.Absolute, out url))
    	{
    		if(IPAddress.TryParse(url.Host, out ip)){
    			//合法的IP
    			Console.WriteLine(ip.ToString()); 
    		}
    	}
    }


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

    • 已標示為解答 黑小胡 2013年11月6日 上午 12:12
    2013年11月5日 上午 10:54
  • Dear 亂馬客.

    感謝你的回答,比我的方法好太多了。

    我用的方法直接找a陣列的IP位子在.Split(':');

    在抓陣列的[0],就抓到IP位子了。

    呵呵,太感謝你了,這樣就不怕陣列位子跑掉了。


    2013年11月6日 上午 12:18
  • 您好,

    後來測試了一下,如果您只處理ipV4的話,那上面的方式應可以滿足您的需求。

    如果還要處理ipV6的話,可以參考一下以下的link哦!

    http://www.dotblogs.com.tw/rainmaker/archive/2013/11/06/126877.aspx


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

    2013年11月6日 上午 03:20