2015-08-26 32 views
3

我想僅在整個文本被它們包圍時才刪除括號。例如:只有當整個文本被它們包圍時,如何去掉括號?

(text (text) text) 

需要對被轉換爲:

text (text) text 

我有一個非常簡單的檢查:

value = (value [0] == '(' && value [value .Length - 1] == ')') ? value.Substring(1, value .Length - 2) : value; 

但它失敗,錯誤地刪除這些類型的字符串的括號:

(text (text)) text (text) 

任何人都可以說出處理所有情況的方法嗎?使用正則表達式也是OK

請注意,括號是平衡的。例如,這種情況是不可能的:

(text (text) 
+0

在你的失敗案例中,「整個文本」沒有被括號包圍,這顯然是你想要修復的,你能否重申你正試圖解決的問題? –

+0

可以在你的例子中的'文本'包含空格嗎? –

+1

正則表達式不適用於此。它缺乏解析和「記憶」上下文的能力。儘管如此,使用循環相當簡單。 – Amit

回答

4

使用一個簡單的循環測試,如果它是 「有效」 進行刪除,刪除第一&最後:

bool isValid = value[0] == '(' && value[value.Length - 1] == ')'; 
int i = 1; 
int c = 0; 
for(; isValid && c >= 0 && i < value.Length - 1; i++) 
{ 
    if(value[i] == '(') 
    c++; 
    else if(value[i] == ')') 
    c--; 
} 

if(isValid && i == (value.Length - 1) && c == 0) 
    value = value.Substring(1, value.Length - 2); 
+0

現在它的錯誤更多了。 'i'和'c'都應該從0開始。當'c'等於0時,你必須斷開循環。(在循環結束時檢查'c == 0') –

+0

@ M.kazemAkhgary - 不,它們應該't ... i = 0已經被驗證,正如Eric剛纔所建議的那樣,它甚至可以通過檢查最後一個字符來改進。 – Amit

+0

@ M.kazemAkhgary:我不明白你的評論;第一個字符已經通過檢查'isValid'的初始化來處理。如果它是真的,那麼有一個字符被處理,並且計數是一個開放的字母。此外,在循環條件下,代碼確實檢查c是否等於零。它是一個非負數,因此檢查它是否大於零就足夠了。 –

1

此擴展方法應該工作;

public static class StringExtensions 
{ 
    public static string RemoveParentheses(this string value) 
    { 
     if (value == null || value[0] != '(' || value[value.Length - 1 ] != ')') return value; 

     var cantrim = false; 
     var openparenthesesIndex = new Stack<int>(); 
     var count = 0; 
     foreach (char c in value) 
     { 
      if (c == '(') 
      { 
       openparenthesesIndex.Push(count); 
      } 
      if (c == ')') 
      { 
       cantrim = (count == value.Length - 1 && openparenthesesIndex.Count == 1 && openparenthesesIndex.Peek() == 0); 
       openparenthesesIndex.Pop(); 
      } 
      count++; 
     } 

     if (cantrim) 
     { 
      return value.Trim(new[] { '(', ')' }); 
     } 
     return value; 
    } 
} 

使用方法如下

Console.WriteLine("(text (text)) text (text)".RemoveParentheses()); 
1

跑了幾個測試案例我認爲這很好

public string CleanString(string CleanMe) 
{ 
    if (string.IsNullOrEmpty(CleanMe)) return CleanMe; 
    string input = CleanMe.Trim(); 
    if (input.Length <= 2) return input; 
    if (input[0] != '(') return input; 
    if (input[input.Length-1] != ')') return input; 
    int netParen = 1; // starting loop at 1 have one paren already 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 1; i < input.Length-1; i++) 
    { 
     char c = input[i]; 
     sb.Append(c); 
     if (c == '(') netParen++; 
     else if (c == ')') netParen--; 
     if (netParen == 0) return input; // this is the key did the() get closed out 
    } 
    return sb.ToString(); 
} 

我是從Amit開始的,但我認爲它是相同的基本邏輯

相關問題