2013-05-28 59 views
2

所以我之前問過這個問題,並說我希望它在JavaScript中,但後來才意識到它是不必要的數據被髮送。所以如果有人能夠幫助我解決C#中的相同問題,那將是非常好的。我需要的是從字符串中獲取多個屬性。c# - 正則表達式來找到後面的字符串=

字符串看起來像:

str = "car[brand=saab][wheels=4]"; 

可以有更多或更少的屬性。

我需要1個變量中的第一個[]之前的所有內容。

然後,我需要每個屬性及其值在一個變量。明白我想要什麼

最簡單的方法大概是來檢查我的previous question和上解決了吧:)

+0

如果您有關於在字符串中尋找模式,使許多問題,也許你應該自己看一本關於RegEx的書。 – jAC

+0

這個*有*要用正則表達式來完成嗎? – Dave

+0

@JanesAbouChleih我一直在努力學習RegEx,但我得到了一個非常緊張的時間表。而且我是一個新手程序員,所以我必須學習,因爲我打字。這就是爲什麼我問的問題,而不是看書,其次閱讀有關編程的書真的不爲我工作:( – emisal

回答

2

我在你的previous question中使用正則表達式(略有不同)。

string input = "car[brand=saab][wheels=4]"; 

string product = ""; 
Dictionary<string, string> props = new Dictionary<string, string>(); 

foreach (Match m in Regex.Matches(input, @"^(\w+)|\[(\w+)=(.+?)\]")) 
{ 
    if (String.IsNullOrEmpty(product)) 
     product = m.Groups[1].Value; 
    else 
     props.Add(m.Groups[2].Value, m.Groups[3].Value); 
} 
+0

然而,這一個是所有的答案中唯一正確的(除了我的^ _ ^) –

+1

這個固定正是我需要的只是要改變,因此被添加到字典中的產品爲好。 感謝! – emisal

2

試試這個正則表達式的答案:

(.+?)(\[.+?\])+ 

和示例代碼:

var inputString = "car[brand=saab][wheels=4]"; 
var pattern = @"(?<v1>.+?)(?<v2>\[.+?\])+"; 

var v1 = Regex.Match(inputString, pattern).Groups["v1"].Value; 

Dictionary<String, String> list = new Dictionary<String, String>(); 
foreach (Capture capture in Regex.Match(inputString, pattern).Groups["v2"].Captures) 
{ 
    var sp = capture.Value.Split('='); 
    list.Add(sp[0], sp[1]); 
} 

說明:

(?<name>subexpression) 捕獲匹配的子表達式到一個組。

+0

這其實是不太一樣的是筆者詢問 –

+0

會不會'v2'還含有方括號作爲拍攝組的一部分? – Darkzaelus

0

既然你已經使用正則表達式的答案,您的意見狀態時,它不一定是一個正則表達式,我將提供一種替代方案:

的代碼是

 string str = ("car[brand=saab][wheels=4]"); 
     int i = str.IndexOf("["); 

     string[] details =str.Substring(i).Replace("]","").Split('['); 

     string name = str.Substring(0, i); 
     string brand = details[1].Split('=')[1]; 
     string wheels = details[2].Split('=')[1]; 

這種方法假設數據總是以相同的格式;你可能需要一些驗證,在那裏取決於你的需求...

1

你可以做到這一點

var lst=Regex.Matches(input,@"(\w+)((?:\[.*?\])+)") 
      .Cast<Match>() 
      .Select(x=>new 
      { 
       name=x.Groups[1].Value, 
       value=Regex.Matches(x.Groups[2].Value,@"(?<=\[).*?(?=\])") 
          .Cast<Match>() 
          .Select(x=>new 
          { 
           name=x.Groups[0].Value.Split('=')[0], 
           value=x.Groups[0].Value.Split('=')[1] 
          }) 
      }); 

現在你可以遍歷LST這樣

foreach(var parent in lst) 
{ 
parent.name;//car 
    foreach(var pairs in parent.value) 
    { 
     pairs.name;//brand,wheels 
     pairs.value;//ferrari,4 
    } 
} 

因此,對於輸入car[brand=a][wheels=4]cycle[brand=b][wheels=2]

輸出會像

car 
    brand,a 
    wheels,4 
cycle 
    brand,b 
    wheels,2 
+0

這是錯誤的。修正所有錯誤的OU後輸入仍然不正確。 Ideone:http://ideone.com/1bIPZA –

+0

http://ideone.com/SswaUI仍然不正確),但幾乎沒有) –

+0

我得到異常http://ideone.com/ZFcxst。也許單2.8的問題,但我得到了同樣的錯誤在LinqPad =) –

0

沒有正則表達式:

string input = "car[brand=saab][wheels=4]"; 

var query = from s in input.Replace("]", "").Split('[') 
      let vars = s.Split('=') 
      let name = vars[0] 
      let value = vars.Length > 1 ? vars[1] : "" 
      select new {Name = name, Value = value}; 

string firstVar = query.First().Name; 
Dictionary<string, string> otherVars = query 
             .Skip(1) 
             .ToDictionary(v => v.Name, v => v.Value); 

您可以訪問的變量在字典中類似這樣的string brand = otherVars["brand"]

相關問題