2014-03-05 62 views
0

我有一個字符串來作爲如何從較長的字符串中解析出此字符串?

FirstName LastLast (WorkerId) 

因此,例如:

"Joe Thompson (234DerX)" 

,我想解析了這一點,這個人對象

class Person 
{ 
     public string Name; //Joe Thompson 
     public string WorkerId; //234DerX 
} 

什麼是最好的方法解析出工作者ID和名稱。正則表達式?更簡單一些。一些名稱有中段的名字或多個名字,所以我可以依靠的唯一的事情是,作業人員ID被包圍「(」 +「)」

+2

這實際上取決於數據在原始源文本中的結構(如果它是結構化的)。但可能是正則表達式的工作,是的。 –

+1

我認爲如果不知道所有**的變化就不可能分辨出來。 – Liam

+2

如果您唯一可以依賴的是工人ID的格式,那將不可能。 –

回答

5

至於你提到inyou發佈only thing i can rely on is that the worker id is surrounded by "(" + ")"我會建議此解決方案:

class Person 
{ 
     public Person(string str) 
     { 
      int pos = str.LastIndexOf('('); 
      Name = str.Substring(0, pos - 1); 
      WorkerId = str.Substring(pos + 1).TrimEnd(')'); 
     } 

     public string Name; 
     public string WorkerId; 
} 
+0

這就是我正處在寫作中的答案+1雖然 - 您需要擺脫WokerId的圓括號以符合OP的要求。 –

+0

@DeeMac謝謝。 –

3

你可以這樣做:

var splitted = "Joe Thompson (234DerX)".Split(" ".ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries); 
var id = splitted.Last(); 
var name = string.Join(" ", splitted.Take(splitted.Count() - 1)); 

它會將最後一部分解析爲Id以及之前的所有名稱。您可以從(Trim ID和)

+0

這是否解析出「(」或「)」在任何地方? – leora

+0

@leora我不明白問題。但是,如果你問,如果我檢查'(' - 答案是否定的,我想這個userId是最後一個條目 – wudzik

7

如果使用正則表達式,下面的正則表達式應該做你想要什麼:

@" *(?<name>.*) \((?<id>.*)\)" 

Name存儲在捕獲組nameWorkerId存儲在捕獲組id

這假定工作人員ID在最後一對括號中。

即使由於某種原因名稱包含括號(例如John (The Third) (JK4532R)),該解決方案也應該可以正常工作。但是,如果輸入中缺少工人ID並且名稱在末尾帶有括號(如John (The Third)

1

如果我理解正確,那麼它將無法區分名稱和工作者ID您可以簡單地按時間間隔分割字符串,然後取出最後得到的字符串,從正面和背面的括號中修剪它,並且您將擁有該ID。 至於名字,因爲你不知道有多少名字,如果你只想將其中的一部分放在字符串中,將會更困難。如果你只需要第一個名字和最後一個名字,那麼只需要從分割中得到數組中的第一個和倒數第二個字符串。

事情是這樣的:

var splitArray = "Joe Thompson (234DerX)".Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); 
var id = splitArray.Last().Trim(new char['(',')']); 
var name = splitArray[0] + " " + splitArray[splitArray.Length - 2]; 

var person = new Person(); 
person.Id = id; 

person.Name = name; 
+0

一些代碼會有用嗎? – Liam

+0

好吧,我已經添加了它。真的有必要投票嗎? – PetarPenev

+0

呃......是的,你的回答很糟糕,這就是這個投票的工作方式 – Liam

0

如果它是如此簡單,我覺得正則表達式是矯枉過正...

int idStart = personStr.IndexOf('('); 
int idEnd = personStr.IndexOf(')'); 
Name = personStr.SubString(0, idStart); 
WorkerId = personStr.SubString(idStart + 1, idEnd - idStart); 

當然,您必須驗證peronStr格式是否正確。

0

您可以使用分割方法是這樣的: -

var split = yourString.Split(new char[] {"("}); 

請參閱MSDN文檔。有關拆分內存分配影響的更多信息。MSDN Split documentaion

0
string hld = "Joe Thompson (234DerX)"; 

    char[] separator = new char[] { '(' }; 
    string[] strSplitArr; 


    strSplitArr = hld.Split(separator); 

    string Name = strSplitArr[0].ToString(); 
    string WorkerId = strSplitArr[1].ToString().Replace(")", "");