如何仅在整个文本被它们包围时删除括号?

时间:2015-08-26 16:04:38

标签: c# .net regex string

我只想在整个文本被它们包围时删除括号。例如:

(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 )

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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());