2013-10-17 20 views
1

我有串,其中一個項目是像,textItem1 = "Brown, Adam. (user)(admin)(Sales)"的名單,我總是要提取從最後一對括號的,在這種情況下將是文本銷售提取最後一對括號從字符串之間的文本,而不正則表達式

我嘗試以下:

string name = DDlistName.SelectedItem.ToString(); 
int start = name.IndexOf("("); 
int end = name.IndexOf("("); 
string result = name.Substring(start + 1, end - start - 1); 
_UILabelPrintName.Text = result; 

問題:這總是從第一對括號的,採文本在此情況下用戶

閱讀大量類似的問題的答案,我意識到正則表達式的可能無法在這種情況下,被推薦(不是特別成功或者嘗試其他代碼)。然而,任何可以完成任務的短程序的幫助都將得到真正的讚賞。

+0

爲什麼沒有正則表達式? :) – Matten

+0

,因爲textItem也可以嵌套括號。如「布朗,亞當(用戶)((ADM)管理員(離岸))(銷售)」。 (http://stackoverflow.com/a/546457/1108500) – shaz

+0

啊哈,這使答案更復雜=) – Matten

回答

1

您需要使用LastIndexOf代替IndexOf,並檢查在最後一個右括號。

string name = "Brown, Adam. (user)(admin)(Sales)"; 
int start = name.LastIndexOf("("); 
int end = name.LastIndexOf(")"); 
string result = name.Substring(start + 1, end - start - 1); 

真的你要驗證startend以確保這兩個括號都被找到了。 LastIndexOf如果找不到字符,則返回-1

而且爲了處理嵌套我們需要的左括號的位置後,繼續向前搜索的右括號。

string name = "Brown, Adam. (user)(admin)((Sales))"; 
int start = name.LastIndexOf('('); 
int end = (start >= 0) ? name.IndexOf(')', start) : -1; 
string result = (end >= 0) ? name.Substring(start + 1, end - start - 1) : ""; 
1

您可以使用拆分功能,打破了串在左括號。最後一個數組元素是帶有尾部「)」的所需輸出,然後將被刪除。

var input = "Brown, Adam. (user)(admin)(Sales)"; 
// var input = DDlistName.SelectedItem.ToString(); 

var lastPick = input.Split(new[] { "(" }, StringSplitOptions.RemoveEmptyEntries).Last(); 
var output = lastPick.Substring(0, lastPick.Length - 1); 

_UILabelPrintName.Text = output; 

另一種方法是使用帶有IndexOf的while循環。它只要切斷輸入字符串作爲另一個「(」被發現,如果沒有更多的「(」被發現,它獲得了剩餘的字符串,直到右括號中的內容「)」:

int current = -1; 
while(name.IndexOf("(") > 0) 
{ 
    name = name.Substring(name.IndexOf("(") + 1); 
} 

var end = name.IndexOf(")"); 
var output = name.Substring(0, end); 

_UILabelPrintName.Text = output; 

或者使用LastIndexOf ....

相關問題